我有一些问题,当我想取代非ascii字符从文件名。当我想复制文件做一些测试时,它回答我“无法打开'FileName'进行阅读:没有这样的文件或目录。所有非ascii文件都被一个“_”改变。你知道如何获得真实的的名字或者如何用一个好的shell脚本替换它吗?非常感谢。
p4rjhz4m1#
要获取文件中的非ascii字符,用户可以使用以下sed语句。
sed 's/[^\d32-\d126]//g' <file_name>
上述指令将把输入文件中的非ASCII字符打印到stdout。通过向sed提供-i选项,用户可以从文件中删除ASCII字符。要将非ascci字符替换为特定字符,用户可以使用以下语句。
sed 's/[\d32-\d126]/<replacing_char>/g' <file_name>
jm81lzqq2#
*如果*您知道在创建文件的MacOS或Windows计算机上使用的编码,则可以使用convmv将该编码更改为您喜欢的编码:
convmv
将单个文件名从UTF 16重新编码为ASCII:
$ convmv -f utf8 -t ascii --notest <FILE NAME>
使用Linux标准化将整个目录从ISO 8859 -1递归地重新编码为UTF 16:
$ convmv -f iso8859-1 -t utf16 --nfc -r --notest <DIRECTORY NAME>
有关详细信息,请参见man convmv和man charsets。
man convmv
man charsets
增编:
如果您没有安装convmv,可以在its project page on freecode.com上安装。
cig3rfwq3#
到目前为止,所有前面的答案都解释了如何处理文件中的非ASCII * 内容 *,而不是实际的文件名。尝试重命名文件,以在Bash中使用文本下划线字符替换任何非ASCII字符:
for file in *[!\ -~]*; do mv -i "$file" "${file//[! -~]/_}" done
parameter expansion${variable//pattern/replacement}产生$variable的值,每个pattern的示例都替换为replacement;所以${file//[! -~]/_}用下划线替换$file中的每个非ASCII字符。这个特殊的构造是一个只支持Bash的特性,因此不能移植到sh、Zsh等。要获得正确的POSIX可移植解决方案,请尝试使用sed执行替换。
${variable//pattern/replacement}
$variable
pattern
replacement
${file//[! -~]/_}
$file
sh
sed
for file in *[!\ -~]*; do mv -i "$file" "$(echo "$file" | sed 's/[^ -~]/_/g')" done
然而,您对从cp等获得错误的抱怨似乎表明您实际上可能有一个引用问题。shell及其实用程序可以健壮地处理任何有效的文件名,但您需要知道When to wrap quotes around a shell variable(或者更广泛地说,任何用作文件名的字符串等)。参见https://mywiki.wooledge.org/BashFAQ/020
cp
3条答案
按热度按时间p4rjhz4m1#
要获取文件中的非ascii字符,用户可以使用以下sed语句。
上述指令将把输入文件中的非ASCII字符打印到stdout。通过向sed提供-i选项,用户可以从文件中删除ASCII字符。
要将非ascci字符替换为特定字符,用户可以使用以下语句。
jm81lzqq2#
*如果*您知道在创建文件的MacOS或Windows计算机上使用的编码,则可以使用
convmv
将该编码更改为您喜欢的编码:将单个文件名从UTF 16重新编码为ASCII:
使用Linux标准化将整个目录从ISO 8859 -1递归地重新编码为UTF 16:
有关详细信息,请参见
man convmv
和man charsets
。增编:
如果您没有安装
convmv
,可以在its project page on freecode.com上安装。cig3rfwq3#
到目前为止,所有前面的答案都解释了如何处理文件中的非ASCII * 内容 *,而不是实际的文件名。
尝试重命名文件,以在Bash中使用文本下划线字符替换任何非ASCII字符:
parameter expansion
${variable//pattern/replacement}
产生$variable
的值,每个pattern
的示例都替换为replacement
;所以${file//[! -~]/_}
用下划线替换$file
中的每个非ASCII字符。这个特殊的构造是一个只支持Bash的特性,因此不能移植到sh
、Zsh等。要获得正确的POSIX可移植解决方案,请尝试使用
sed
执行替换。然而,您对从
cp
等获得错误的抱怨似乎表明您实际上可能有一个引用问题。shell及其实用程序可以健壮地处理任何有效的文件名,但您需要知道When to wrap quotes around a shell variable(或者更广泛地说,任何用作文件名的字符串等)。参见https://mywiki.wooledge.org/BashFAQ/020