我需要帮助。我应该编写一个脚本,将所有非ASCII文件从一个目录移动到另一个目录。我得到了这段代码,但我不知道它为什么不起作用。
#!/bin/bash
for file in "/home/osboxes/Parkhom"/*
do
if [ -eq "$( echo "$(file $file)" | grep -nP '[\x80-\xFF]' )" ];
then
if test -e "$1"; then
mv $file $1
fi
fi
done
exit 0
答案 0 :(得分:1)
目前尚不清楚你追求的是哪一个,但是:
•要测试变量 $file
是否包含非ASCII字符,您可以执行以下操作:
if [[ $file == *[^[:ascii:]]* ]]; then
•要测试文件 $file
是否包含非ASCII字符,您可以执行以下操作:
if grep -qP '[^[:ascii:]]' "$file"; then
例如,您的代码如下所示:
for file in "/some/path"/*; do
if grep -qP '[^[:ascii:]]' "$file"; then
test -d "$1" && mv "$file" "$1"
fi
done
答案 1 :(得分:0)
第一个问题是你的第一个if语句有一个无效的测试子句。 -eq
的{{1}}运算符需要在前一个参数和后一个参数;你之前的争论已经消失或空洞。
第二个问题是我认为[
是多余的。
第三个问题是echo
命令始终具有ASCII输出,但您要检查二进制输出,这是您永远不会看到的。
使用file
相当聪明的应用程序,虽然有两种方法可以继续这个; file
表示各种各样的事情以及您感兴趣的内容是file
和data
,但并非所有不标识为ASCII
的文件都是ASCII并非所有不标识为data
的文件都是数据。除非您需要支持Unicode文件,否则最好不要使用ASCII
的原始想法。您的grep
对我来说有点奇怪,所以我不知道您的环境是什么,但我可能会尝试这样做:
grep
#!/bin/bash
for file in "/home/osboxes/Parkhom"/*
do
if grep -qP '[\0x80-\0xFF]' $file; then
[ -e "$1" ] && mv $file $1
fi
done
选项意味着安静,只返回返回代码,不显示匹配项。 (-q
中可能为-s
。返回代码由grep
语句直接测试(无需使用if
或[
)。下一行中的test
只是一个快速说明左侧是否为真的方法,然后执行右侧。如果您发现更清楚,您还可以将其形成为&&
语句。 if
是[
的同义词。就个人而言如果test
是一个目录并且没有变化,我会在脚本开头检查一次,而不是在每个文件上检查一次,它会更快。
答案 2 :(得分:0)
如果您想知道某些内容是否不是纯文本文件,那么您可以使用file
命令返回有关文件类型的信息。
[[ ! $( file -b "$file" ) =~ (^| )text($| ) ]]
-b
只是告诉它不要打扰返回文件名。
返回的值类似于:
ASCII text
HTML document text
POSIX shell script text executable
PNG image data, 21 x 34, 8-bit/color RGBA, non-interlaced
gzip compressed data, from Unix, last modified: Mon Oct 31 14:29:59 2016
正则表达式将检查返回的文件信息是否包含所有纯文本文件类型中包含的单词“text”。
如果您需要的话,您可以过滤特定的文件类型,例如“ASCII文本”。