Linux将文件重命名为dirname

时间:2016-04-11 02:46:44

标签: linux bash find rename

我有很多这样的文件:

./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

3 个答案:

答案 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##*.}"' \;