如何通过find命令一一重命名所有文件?

时间:2021-04-24 13:27:00

标签: bash shell file find rename

我想向 find 命令打印的每个文件附加一个字符串。它在一个新行上打印每个文件。问题是每个文件都有一个唯一的字符串附加到它的名字上。这就是我需要它工作的方式

<块引用>

运行查找命令 打印第一个结果 有一个阅读提示,让用户输入 string ,然后将该字符串附加到名称。 打印第二个结果。 有一个阅读提示..然后将该字符串附加到第二个名称 ... 对所有文件依此类推

我尝试使用 while 循环来执行此操作,但尚未成功

find . -type f -name 'file*' | 
  while IFS= read file_name; do 
    read -e -p "Enter your input : " string
    mv "$file_name" "$file_name $string" 
  done

例如。假设原始文件名是 demo1.mp4 ,我在读取提示中输入 'test' ,然后文件名应重命名为 'demo1 test.mp4' (在将字符串附加到文件名末尾之前应该有一个空格)

1 个答案:

答案 0 :(得分:1)

您可以通过 Parameter Expansion 进行字符串切片,例如。

find . -type f -name 'file*' | {
  while IFS= read file_name; do
    name="${file_name%.*}"
    ext="${file_name#*"$name"}"
    read -e -p "Enter your input : " string </dev/tty
    echo mv "$file_name"  "$name $string$ext" 
  done
}

由于 read 循环中有两个 while,因此从 </dev/tty 读取是另一种解决方法,不确定它是否是操作系统。具体与否,但如果它可用 /dev/tty 那么它应该可以解决问题。


read里面有两个while loop 另一种方法是使用Process Substitution,除了使用/dev/tty

 while IFS= read -u9 file_name; do
    name="${file_name%.*}"
    ext="${file_name#*"$name"}"
    read -e -p "Enter your input : " string
    echo mv "$file_name"  "$name $string$ext" 
  done 9< <(find . -type f -name 'file*')

如果您对输出感到满意,请删除 echo

这里有一些很好的例子Howto Parameter Expansion

Process Substitution 的一些很好的例子。

相关问题