我想使用bash重命名目录中的文件。
我在尝试:
find . -type f -exec mv '{}' $(urlencode {}) \;
但是urlencode按字面意思{}
进行编码,而不是搜索结果。
如果更改为:
. -type f -exec mv '{}' $(echo {}) \;
echo打印查找结果。
urlencode是别名:
$alias urlencode='python -c "import sys, urllib as ul; \
print ul.quote_plus(sys.argv[1])"
Decoding URL encoding (percent encoding)
任何人都可以解释这种行为并建议解决方案吗?
答案 0 :(得分:2)
使用bash -c
命令:
find . -type f -exec bash -c 'mv "$1" $(urlencode "$1")' _ {} \;
答案 1 :(得分:1)
下面,
find . -type f -exec mv '{}' $(echo {}) \;
命令替换是不加引号的,因此在find
看到它之前,它会在命令行中展开。生成的结果命令是
find . -type f -exec mv '{}' {} \;
然后find
用当前文件名替换{}
的两个副本。如果命令替换是双引号,也会发生同样的情况。
如果它是单引号,那么find
将扩展其中的{}
,并运行mv ./somefile $(echo ./somefile)
之类的命令,除非目录{ {1}}存在。
这里的要点是 $(echo .
没有通过shell 。
你需要明确要求一个shell。每个文件一次
find -exec
或一个用于多个文件的shell和一个用于处理所有文件的循环
find . -type f -exec sh -c 'mv "$1" "$(urlencode "$1")"' sh {} \;
当然,如果find . -type f -exec sh -c 'for f; do mv "$f" "$(urlencode "$f")"; done' sh {} +
是别名,那么你必须通过箍来让它在非交互式shell中工作。将它作为脚本添加到urlencode
或作为导出的函数(在这种情况下,运行PATH
而不是bash -c
)可能会更好。