使用函数重命名文件

时间:2017-12-14 13:13:24

标签: python bash

我想使用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)

任何人都可以解释这种行为并建议解决方案吗?

2 个答案:

答案 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)可能会更好。