我有像这样的文件夹和文件结构
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_file
name 的变量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
.