linux iconv 文件夹,linux – 如何使用来自Bash的iconv递归重命名文件和文件夹

我一直试图用iconv递归重命名文件和文件夹,但没有成功,文件被正确重命名但文件夹没有.

我用于文件的是(完美的):

find . -name * -depth \ -exec bash -c 'mv "$1" "${1%/*}/$(iconv -f UTF8 -t ASCII//TRANSLIT <<< ${1##*/})"' -- {} \;

我尝试过的文件和文件夹(失败:只重命名文件夹):

find . -exec bash -c 'mv "$1" "$(iconv -f UTF8 -t ASCII//TRANSLIT <<< $1)"' -- {} \;

原始问题:

我只想批量重命名大量文件,使它们“网络友好”,想像删除空格,奇怪的字符等等,目前我有

find . -name '*' -depth \

| while read f ;

do

mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr -s ' ' _|tr -d "'"|tr -d ","|tr - _|tr "&" "y"|tr "@" "a")" ;

done

有什么办法可以在上面运行上面的tr和一次运行的iconv吗?因为我正在谈论300,000个文件要重命名,我想尽可能避免第二次搜索.

如果需要,我正在使用Bash 4.2.24

提前致谢.

解决方法:

我认为以下内容可以在一次通过中完成您想要的一切.

# Update: if this doesn't work, use read -d '' instead

find . -print0 | while IFS= read -d '$\000' f ;

do

orig_f="$f"

# Below is pure bash. You can replace with tr if you like

# f="$( echo $f | tr -d ,\' | tr "$'&'@- " "ya__" )"

f="${f// /_}" # Replace spaces with _

f="${f//\'}" # Remove single quote

f="${f//-/_}" # Replace - with _

f="${f//,}" # Remove commas

f="${f//&/y}" # Replace ampersand with y

f="${f//@/a}" # Replace at sign with a

f=$( iconv -f UTF8 -t ASCII//TRANSLIT <<< "$f" )

new_dir="$(dirname $f)"

new_f="$(basename $f)"

mkdir -p "$new_dir"

mv -i "$orig_f" "$new_dir/$new_f"

done

find命令(不需要实际选项,除了-print0来处理带空格的文件名)将向while循环发送空分隔文件名(毫无疑问,有人会在那里纠正我的错误).利用参数扩展的一长串分配删除/替换各种字符;我将使用tr作为注释的等效管道包含在内.然后我们通过iconv运行文件名来处理字符集问题.最后,我们将名称拆分为其路径和文件名组件,因为我们可能必须在执行mv之前创建一个新目录.

标签:bash,file,linux,iconv,tr

来源: https://codeday.me/bug/20190704/1375065.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值