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

How to rename all files one by one through find command?

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

Run the find command Print the first result Have a read prompt for user to enter string , then append that string to the name. Print the second result. Have a read prompt .. then append that string to the second name ... and so on for all of the files

我试过使用 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' (在将字符串附加到之前应该有一个 space文件名结尾 )

您可以通过 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
}

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


while loop里面有两个read除了用/dev/tty

还有一个办法就是用Process Substitution
 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的一些很好的例子。