我想向 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' (在将字符串附加到文件名末尾之前应该有一个空格)
答案 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 的一些很好的例子。