【问题标题】:Rename all files within a folder prefixed with foldername [duplicate]重命名以文件夹名称为前缀的文件夹中的所有文件[重复]
【发布时间】:2016-06-14 06:23:26
【问题描述】:

我有一堆目录,每个目录都有多个文件。

dir1 
|- part1.txt 
|- part2.txt . . .

dir2 
|- part1.txt 
|- part2.txt . . .

我想将内部文件(part1.txt 等)重命名为(dir1_part1.txt)。这在 ubuntu 中如何实现?

This question 解释了如何添加或删除后缀前缀。但是如何添加前缀作为目录名称

【问题讨论】:

  • 如何获取目录列表作为前缀?
  • 你真的花时间学习基本的shell脚本吗?如果是这样,请显示您尝试的脚本。获取目录名称的方法有很多种,最好的方法可能取决于您如何编写脚本的其余部分。

标签: linux bash shell ubuntu terminal


【解决方案1】:

有一个名为perl-rename 的工具有时称为rename,不要与rename from util-linux 混淆。该工具采用 perl 表达式并相应地重命名:

perl-rename 's~/~_~' dir1/* dir2/*

上面会将dir1dir2中的所有文件重命名并移动到以下位置:

dir1/file1 -> dir1_file1
dir1/file2 -> dir1_file2
dir1/file3 -> dir1_file3

You can play with the regex online

【讨论】:

    【解决方案2】:

    一个简单的bash 脚本,使用findparameter-expansion 来查找目录名称。

    #!/bin/bash
    
    find . -name "*.csv" -type f -printf '%f\n' |
       while read -r x; do
           mv -v "$x" "${PWD##*/}_$x"
       done
    

    处理带有特殊字符的文件:-

    为了处理包含换行符或其他类型的空格或其他特殊字符的文件名,我从find 采用-print0 并使用分隔符'' 读取它们:-

    我再次使用参数扩展,从 find 命令中去除前导字符 ./

    #!/bin/bash
    
    find . -name "*.csv" -type f -print0 |
       while IFS= read -r -d '' x; do
           x="${x:2}"
           mv -v "$x" "${PWD##*/}_$x"
       done
    

    一个工作示例:-

    [dude@csv_folder]$ ls *.csv
    1.csv  2.csv  3.csv  4.csv
    
    [dude@csv_folder]$ ./myScript.sh
    `1.csv' -> `csv_folder_1.txt'
    `2.csv' -> `csv_folder_2.txt'
    `3.csv' -> `csv_folder_3.txt'
    `4.csv' -> `csv_folder_4.txt'
    

    【讨论】:

      【解决方案3】:

      好的,这是一个简单的例子。

      $ mkdir dir{1..5}
      $ touch dir{1..5}/part{1..5}.txt
      # the command above create the files for testing
      # then do the rename action
      $ for f in dir*/*;do mv -v $f $(dirname $f)/$(dirname $f)_$(basename $f);done
      

      【讨论】:

      • eeee...Don't parse ls or find 至少没有 for 循环。
      • 好的,改成通配符
      • 请引用参数扩展
      • 如果您使用不带引号的echo $f,则所有更改的ls-to-glob 都没有用。 :D 你可以简单地使用 dirname & basename。尽量避免使用sed 进行文件名操作。至少为此目的使用sed -z
      • @anishsane 或:"${f##*/}" 用于基本名称,"${f%/*}" 用于目录名称