Bash 将移动非ASCII文件的脚本

Bash 将移动非ASCII文件的脚本,bash,grep,Bash,Grep,我需要帮助。我应该写一个脚本,它将所有非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

我需要帮助。我应该写一个脚本,它将所有非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

不清楚您要找的是哪一个,但是:

•要测试变量$file是否包含非ASCII字符,可以执行以下操作:

if [[ $file == *[^[:ascii:]]* ]]; then
if grep -qP '[^[:ascii:]]' "$file"; then
•要测试文件$file是否包含非ASCII字符,可以执行以下操作:

if [[ $file == *[^[:ascii:]]* ]]; then
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

第一个问题是您的第一个if语句有一个无效的test子句。[的-eq运算符需要在前后各取一个参数;您的before参数已消失或为空

第二个问题是,我认为回声是多余的

第三个问题是file命令总是有ASCII输出,但是您正在检查二进制输出,这是您永远看不到的

在这个应用程序中使用file pretty smart,虽然有两种方法可以实现这一点;file表示各种各样的东西,您感兴趣的是数据和ASCII,但并非所有未标识为数据的文件都是ASCII,也并非所有未标识为ASCII的文件都是数据。您最好还是使用我们最初的想法ing grep,除非您需要支持Unicode文件。您的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选项意味着保持安静,只返回一个返回码,不显示匹配项。它可能是grep中的-s。返回码由if语句直接测试,无需使用[或测试。下一行中的&&只是表示如果左侧为真,则执行右侧的快捷方式。如果您觉得更清楚,也可以将其形成if语句。[是test的同义词。就个人而言,如果$1是一个目录并且没有更改,我会在脚本的开头检查它一次,而不是在每个文件上,这样会更快。

如果您想知道某个文件是否不是纯文本文件,那么可以使用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
正则表达式将检查返回的文件信息是否包含所有纯文本文件类型所包含的word文本


如果您只需要ASCII文本,您可以过滤特定的文件类型。

非ASCII文件是什么意思?您是否正在查找包含7位ASCII域以外字节的文件?如果您正在运行的代码不工作,它会做什么而不工作?是否有错误可以添加到您的问题中?p请看一看关于改进此问题的提示,以及创建的帮助。此代码移动所有文件…而ASCII或非ASCICODE应在文件夹或非ASCII中找到ASCII文件并将其移动我需要将所有非ASCII文件从我在代码中编写的目录移动到我将在终端中编写的目录我的代码也将如下所示?!/bin/bash用于/home/osbox/Parkhom/*do if[-eq$echo$file$file | grep-qP'[^[:ascii:]['$file];然后,如果测试-e$1;那么mv$file$1 fi fi结束退出0太好了!确保投票并将答案标记为已解决,如果它对您有效。@GrishaLevit,请注意grep-P是不可移植的,并且与您在答案中使用的RE不必要。BRE甚至支持字符类,所以普通的旧grep应该执行JU另外,我建议将OP的测试条件调整为test-d$1,这样他就不会冒险将源目录中的每个文件都移动到同一个目标文件名。