我的文件夹和文件结构如
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中实现?
答案 0 :(得分:2)
您想要多少种不同的方法?
如果名称不包含空格或换行符或其他有问题的字符,并且中间目录始终是单个数字,并且您在文件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)
答案 1 :(得分:2)
使用循环如下:
while IFS= read -d $'\0' -r line
do
mv "$line" "${line%/*}_${line##*/}"
done < <(find Folder -type f -print0)
此方法处理文件名中的空格,换行符和其他特殊字符,而中间目录不一定必须是单个数字。
答案 2 :(得分:1)
如果名称始终相同,即“文件”:
,则可能会有效for i in {1..3};
do
mv $i/file ${i}_file
done
如果您在数字范围内有更多目录,请更改{1..3}
的{{1}}。
我使用{x..y}
代替${i}_file
,因为它会将$i_file
视为名称$i_file
的变量,而我们只希望i_file
成为变量, i
及其附带的文字。
答案 3 :(得分:0)
来自AskUbuntu的此解决方案为我工作。
这是一个执行该操作的bash脚本:
注意:如果任何文件名包含空格,则此脚本不起作用。
#! /bin/bash # Only go through the directories in the current directory. for dir in $(find ./ -type d) do # Remove the first two characters. # Initially, $dir = "./directory_name". # After this step, $dir = "directory_name". dir="${dir:2}" # Skip if $dir is empty. Only happens when $dir = "./" initially. if [ ! $dir ] then continue fi # Go through all the files in the directory. for file in $(ls -d $dir/*) do # Replace / with _ # For example, if $file = "dir/filename", then $new_file = "dir_filename" # where $dir = dir new_file="${file/\//_}" # Move the file. mv $file $new_file done # Remove the directory. rm -rf $dir done
chmod +x file_name
Folder/
。./file_name
运行脚本。