2017-01-31 11 views
0

私は助けが必要です。 ASCII以外のファイルをあるディレクトリから別のディレクトリに移動するスクリプトを書くべきです。私はこのコードを持っていますが、なぜ動作していないのかわかりません。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

"非ASCII"ファイルとはどういう意味ですか?あなたは、7ビットASCIIの領域外にあるバイトを含むファイルを探していますか?実行しているコードが動作していない場合、動作する代わりに何をしますか?あなたの質問に追加できるエラーはありますか?この質問を改善するためのヒントや、[* how-to-ask **](http://stackoverflow.com/help/how-to-ask) * MCVE **](http://stackoverflow.com/help/mcve)。 – ghoti

+0

このコードでは、ASCIIまたはASCII以外のすべてのファイルを移動します –

+0

コードはフォルダ内またはASCII以外のASCIIファイルを見つけて移動する必要があります –

答えて

1

それはあなたがした後である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 
+0

ディレクトリ内のすべての非ASCIIファイルをディレクトリiターミナルに書き込む –

+0

私のコードはこのようになりますか?/etc/[/ eq/bin/bash ]/home/osboxes/Parkhomのファイルの場合/ の場合 [-eq "$(echo" $(file $ file) "| grep -qP '[^ [: ascii:]] '"$ file") "]; then test -e "$ 1"の場合は; mv $ファイル$ 1 fi fi done 出口0' –

+0

ロシアのおかげでこんにちは:) –

0

-eq演算子が[の場合は、beforeとafterの引数を1つずつ取る必要があります。あなたの前の引数はなくなっています。

第二の問題は、私はechoが冗長であると考えていることです。

第3の問題は、fileコマンドは常にASCII出力を持っていますが、あなたが見ることは決してないだろうバイナリ出力のためにチェックしているということです。あなたがこの上で行くことができる2つの方法があるが、この用途のためにかなりスマートfileを使用して

fileにはdataASCIIというものがありますが、dataと認識されないファイルはすべてASCIIであり、ASCIIと認識されないファイルはすべてデータではありません。 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は私には少し奇妙です。 (それはあなたのgrep-sかもしれません。)戻りコードはif声明([またはtestを使用する必要はありません)で直接テストされます。次の行にある&&は、左辺が真であるかどうかを簡単に示したもので、右辺を実行します。あなたはそれが明確であるとわかるならば、ifと書くこともできます。 [testの同義語です。個人的に$1がディレクトリで変更されない場合は、各ファイルではなくスクリプトの冒頭で一度確認します。

+0

助けてくれてありがとう! –

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 

正規表現は、返されたファイルの情報が、すべてのテキストファイルの種類のために含まれている単語「テキスト」が含まれるかどうかを確認します。

"ASCIIテキスト"のような特定の種類のファイルを必要に応じてフィルタすることができます。

関連する問題