Linux将文件重命名为dirname

我有很多像这样的文件:

./1/wwuhw.mp3 ./2/nweiewe.mp3 ./3/iwqjoiw.mp3 ./4/ncionw.MP3 ./5/joiwqfm.wmv ./6/jqoifiew.WMV 

我怎么能在Linux Bash中像这样重命名它们:

 ./1/1.mp3 ./2/2.mp3 ./3/3.mp3 ./4/4.MP3 ./5/5.wmv ./6/6.WMV 

Solutions Collecting From Web of "Linux将文件重命名为dirname"

尝试这个,

 for i in */*; do mv $i $(dirname $i)/$(dirname $i).${i##*.}; done 

For循环迭代遍历目录中的每个文件。 而mv语句将逐一重命名目录中的每个文件。

for循环方法(如其他一些答案中所述)足以满足大多数情况,在这种情况下,需要将目录中的每个文件重命名为第一个父目录的名称。 我特殊的情况要求更细一些,我只想重命名一个目录中的文件子集 ,并断言操作数实际上是一个实际的文件 ,而不是空目录,符号链接等。使用find除了增加对文件输入和输出进行过滤和处理的功能之外,还可以实现您想要的功能。

 ##################################### # Same effect as using a `for` loop # ##################################### # # -mindepth 2 : ensures that the file has a parent directory. # -type f : ensures that we are working with a `regular file` (not directory, symlink, etc.). find . -mindepth 2 -type f -exec bash -c 'file="{}"; dir="$(dirname $file)"; mv "$file" "$dir/${dir##*/}.${file##*.}"' \; ######################### # Additional filtration # ######################### # mp3 ONLY (case insensitive) find . -mindepth 2 -type f -iname "*.mp3" -exec bash -c 'file="{}"; dir="$(dirname $file)"; mv "$file" "$dir/${dir##*/}.${file##*.}"' \; # mp3 OR mp4 ONLY (case insensitive) find . -mindepth 2 -type f \( -iname "*.mp3" -or -iname "*.mp4" \) -exec bash -c 'file="{}"; "dir=$(dirname $file)"; mv "$file" "$dir/${dir##*/}.${file##*.}"' \; 

像这样的东西应该做的工作:

 for i in */*; do echo mv "${i}" "${i%/*}/${i%/*}.${i##*.}" done 

请参阅这里的例子,这个神秘的参数展开(像${i%/*} )在bash是什么意思。

上面的脚本只会打印控制台中的命令,而不会调用它们。 一旦你确定你想继续,你可以删除echo语句并让它运行。

如果你不介意使用外部工具,那么rnm可以很容易地做到这一点:

 rnm -ns '/pd0/./e/' */* 

/pd0/是直接的父目录, /pd1/是之前的目录等等。

-ns表示名称字符串/pd//e/是分别扩展到父目录文件扩展 名的字符串规则

/pd/ rule的通用格式是/pd<digit>-<digit>-<delim>/ ,例如, /pd0-2-_/这样的规则将从dir2/dir1/dir0目录结构中构造dir0_dir1_dir2dir2/dir1/dir0

更多的例子可以在这里找到。