我有很多这样的文件:
./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
答案 0 :(得分:0)
试试这个,
for i in */*; do mv $i $(dirname $i)/$(dirname $i).${i##*.}; done
For
循环遍历目录中的每个文件。和mv
语句逐个重命名目录中的每个文件。
答案 1 :(得分:0)
如果您不介意使用外部工具,那么rnm可以非常轻松地完成此操作:
rnm -ns '/pd0/./e/' */*
/pd0/
是直接父目录,/pd1/
是之前的目录,依此类推。
-ns
表示名称字符串,/pd/
和/e/
是名称字符串规则,扩展为父目录< / em>和文件扩展名。
/pd/
规则的一般格式为/pd<digit>-<digit>-<delim>/
,例如/pd0-2-_/
之类的规则将从dir0_dir1_dir2
<的目录结构构建dir2/dir1/dir0
/ p>
可以找到更多示例here。
答案 2 :(得分:0)
for
循环方法,如其他一些答案中所述,对于大多数需要将目录中的每个文件重命名为第一个父级& #39;的目录名称。我的特殊情况需要更多粒度,我只想重命名目录中文件的子集,并断言操作数实际上是一个实际的文件,不是空目录,符号链接等。使用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##*.}"' \;