繁体   English   中英

脚本将移动非ASCII文件

[英]Script which will move non-ASCII files

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

•要测试文件 $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

第一个问题是您的第一个if语句具有无效的test子句。 [-eq运算符需要在前一个参数和后一个参数; 您之前的参数不存在或为空。

第二个问题是我认为echo是多余的。

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

尽管有两种方法可以对此应用程序使用file智能,但可以使用两种方法: file说各种各样的事情,你感兴趣的是什么dataASCII ,但并不表明不认同,因为所有文件data是ASCII,而不是不作为标识的所有文件ASCII的数据。 除非您需要支持Unicode文件,否则最好还是使用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选项表示保持安静,仅返回返回码,不显示匹配项。 (在您的grep可能是-s 。)返回代码直接通过if语句进行测试(无需使用[test )。 下一行中的&&只是说出左侧是否为真,然后执行右侧的一种快速方法。 如果找到更清晰的内容,也可以将其形成为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

正则表达式将检查返回的文件信息是否包括所有纯文本文件类型都包含的单词“ text”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM