我正在尝试重命名当前目录中的所有文件,以便将大写名称转换为小写名称。我正在尝试这样做:
ls -1|gawk '{print "`mv "$0" "tolower($0)"`"}'|xargs -i -t eval {}
我的目录中有两个文件,Y和YY 添加 -t 用于调试,输出为:
eval `mv Y y`
xargs: eval: No such file or directory
如果我自己执行 eval,它会起作用并将 Y 移动到 y。
我知道还有其他方法可以实现这一目标,但如果可以的话,我想让它发挥作用! 干杯
虽然您正在寻找 xargs 解决方案,但可以使用
tr
完成执行相同操作的另一种方法(假设 sh/bash/ksh 语法):
for i in *; do mv $i `echo $i | tr '[A-Z]' '[a-z]'`; done
如果您的文件是由创意用户创建的,您将看到如下文件:
My brother's 12" records
到目前为止的解决方案不适用于此类文件。如果您安装了 GNU Parallel,这将起作用(即使是具有创意名称的文件):
ls | parallel 'mv {} "$(echo {} | tr "[:upper:]" "[:lower:]")"'
观看介绍视频以了解更多信息:http://www.youtube.com/watch?v=OpaiGYxkSuQ
您可以将 eval 与 xargs 一起使用,如下所示。
注意:我只在 bash shell 中测试过这个
ls -1| gawk '{print "mv "$0" /tmp/"toupper($0)""}'| xargs -I {} sh -c "eval {}"
或
ls -1| gawk '{print "mv "$0" /tmp/"toupper($0)""}'| xargs -I random_var_name sh -c "eval random_var_name"
当我想避免单行 for 循环时,我通常使用这种方法。
例如
for file in $(find /some/path | grep "pattern");do somecmd $file; done
同样可以这样写
find /some/path | grep "pattern"| xargs -I {} sh -c "somecmd {}"
for
循环帮助了其他人,所以我想我会展示如何直接在awk
中执行此操作:
➜ $ touch E F G H I
➜ $ ls -1 | gawk '{system("mv " $0 " " tolower($0))}'
➜ $ ls
e f g h i