我有像这样的文件夹和文件结构
Folder/1/fileNameOne.ext
Folder/2/fileNameTwo.ext
Folder/3/fileNameThree.ext
...
如何重命名文件以使输出变为
Folder/1_fileNameOne.ext
Folder/2_fileNameTwo.ext
Folder/3_fileNameThree.ext
...
如何在 linux shell 中实现这一点?
你想用多少种不同的方式来做到这一点?
如果名称不包含空格或换行符或其他有问题的字符,并且中间目录始终是单个数字,并且如果您将要重命名的文件列表放在file.list每行一个名称的文件中,那么可以使用多种可能的方法之一重命名是:
sed 's%\(.*\)/\([0-9]\)/\(.*\)%mv \1/\2/\3 \1/\2_\3%' file.list | sh -x
在确定它会执行您想要的操作之前,您应该避免通过 shell 运行命令;只需查看生成的脚本,直到正确为止。
还有一个命令叫做rename——不幸的是,有几个实现,并不是所有的都同样强大。如果你有一个基于 Perl 的(使用 Perl 正则表达式将旧名称映射到新名称),你可以使用:
rename 's%/(\d)/%/${1}_%' $(< file.list)
使用循环如下:
while IFS= read -d $'\0' -r line
do
mv "$line" "${line%/*}_${line##*/}"
done < <(find Folder -type f -print0)
此方法处理文件名中的空格、换行符和其他特殊字符,中间目录不一定必须是个位数。
如果名称始终相同,即“文件”,这可能会起作用:
for i in {1..3};
do
mv $i/file ${i}_file
done
如果您在数字范围内有更多目录,请更改{1..3}为{x..y}.
我使用${i}_file而不是$i_file因为它会考虑$i_filename 的变量i_file,而我们只想i成为变量和file附加到它的文本。
AskUbuntu的这个解决方案对我有用。
这是一个执行此操作的 bash 脚本:
注意:如果任何文件名包含空格,则此脚本不起作用。
#!/bin/bash
# 只遍历当前目录中的目录。
对于 $(find ./ -type d) 中的目录
做
# 删除前两个字符。
# 最初,$dir = "./directory_name"。
# 这一步之后,$dir = "directory_name".
dir="${dir:2}"
# 如果 $dir 为空则跳过。仅在 $dir = "./" 最初发生时发生。
如果 [ !$目录]
然后
继续
菲
# 遍历目录中的所有文件。
对于 $(ls -d $dir/*) 中的文件
做
# 用。。。来代替 _
# 例如,如果 $file = "dir/filename",那么 $new_file = "dir_filename"
# 其中 $dir = 目录
new_file="${file/\//_}"
# 移动文件。
mv $file $new_file
完毕
# 删除目录。
rm -rf $目录
完毕
chmod +x 文件名
Folder/。./file_name.