0

我想重命名某个目录中选择的几个文件find,然后使用xargsmv重命名文件,使用参数扩展。然而,它没有工作......

示例

mkdir test
touch abc.txt
touch def.txt

find . -type f -print0 | \
xargs -I {} -n 1 -0 mv {} "${{}/.txt/.tx}"

结果

bad substitution
[1]    134 broken pipe  find . -type f -print0

工作解决方案

for i in ./*.txt ; do mv "$i" "${i/.txt/.tx}" ; done

尽管我终于找到了解决问题的方法,但我仍然想知道为什么第一种find+xargs方法不起作用,因为我认为第二种方法对于类似的任务不是很通用。

谢谢!

4

1 回答 1

1

请记住,shell 变量替换发生您的命令运行之前。所以当你运行时:

find . -type f -print0 | \
xargs -I {} -n 1 -0 mv {} "${{}/.txt/.tx}"

shell 甚至在运行之前就尝试扩展该${...}构造xargs......并且由于该表达式的内容不是有效的 shell 变量引用,因此您会收到错误消息。更好的解决方案是使用以下rename命令:

find . -type f -print0 | \
xargs -I {} -0 rename .txt .tx {}

由于rename可以对多个文件进行操作,因此您可以将其简化为:

find . -type f -print0 | \
xargs -0 rename .txt .tx
于 2018-11-12T19:06:45.347 回答