2017-01-31 3 views
0

Ich brauche Hilfe. Ich sollte ein Skript schreiben, das alle Nicht-ASCII-Dateien von einem Verzeichnis in ein anderes verschiebt. Ich habe diesen Code, aber ich weiß nicht, warum es nicht funktioniert.Skript, das Nicht-ASCII-Dateien verschiebt

#!/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

Was meinen Sie mit einer "Nicht-ASCII" -Datei? Suchen Sie nach Dateien, die Bytes enthalten, die außerhalb des Bereichs von 7-Bit-ASCII liegen? Wenn der Code, den Sie ausführen, nicht funktioniert, was macht er statt zu arbeiten? Gibt es Fehler, die Sie zu Ihrer Frage hinzufügen können? Bitte werfen Sie einen Blick auf [** how-to-ask **] (http://stackoverflow.com/help/how-to-ask) für Tipps zur Verbesserung dieser Frage sowie die Hilfe beim Erstellen eines [* * MCVE **] (http://stackoverflow.com/help/mcve). – ghoti

+0

Dieser Code verschiebt alle Dateien ... statt ASCII oder Nicht-ASCII –

+0

Code sollte ASCII-Dateien in Ordner oder Nicht-ASCII finden und verschieben Sie sie –

Antwort

1

Es ist nicht klar, welche Sie nach, aber:

• Um zu testen, ob die Variable$file einen Nicht-ASCII-Zeichen enthält, können Sie tun:

if [[ $file == *[^[:ascii:]]* ]]; then 

• Um zu testen, ob die Datei$file ein Nicht-ASCII-Zeichen enthält, können Sie Folgendes tun:

if grep -qP '[^[:ascii:]]' "$file"; then 

Code So zum Beispiel würde wie folgt aussehen:

for file in "/some/path"/*; do 
    if grep -qP '[^[:ascii:]]' "$file"; then 
     test -d "$1" && mv "$file" "$1" 
    fi 
done 
+0

Ich muss alle Nicht-ASCII-Dateien aus dem Verzeichnis, das ich schrieb in einen Code in das Verzeichnis i wird in Terminal schreiben –

+0

Also wird mein Code so aussehen? '#!/Bin/bash für Datei in"/home/osboxes/Parkhom "/ * do wenn [-eq" $ (echo "$ (Datei $ Datei)" | grep -qP '[^ [:] ascii:]] '"$ file") "]; dann wenn test -e "$ 1"; dann mv $ file $ 1 fi fi getan Ausfahrt 0' –

+0

Dank viel Grischa) Hallo aus Russland :) –

0

Das erste Problem ist, dass Ihre erste if-Anweisung eine ungültige Test-Klausel hat. Der Operator -eq von [ muss ein Argument vor und nach dem Argument nehmen; Dein Vorher-Argument ist weg oder leer. Das zweite Problem ist, dass ich denke, echo ist redundant.

Das dritte Problem ist, dass der Befehl file immer ASCII-Ausgabe hat, aber Sie auf binäre Ausgabe überprüfen, die Sie nie sehen werden.

Verwenden file ziemlich schlau für diese Anwendung, obwohl es zwei Möglichkeiten gibt, die Sie weitermachen können; file sagt eine Vielzahl von Dingen und was Sie interessiert sind data und ASCII, aber nicht alle Dateien, die nicht als data identifizieren sind ASCII und nicht alle Dateien, die nicht als ASCII identifizieren sind Daten. Sie könnten besser mit der ursprünglichen Idee der Verwendung von grep gehen, es sei denn, Sie müssen Unicode-Dateien unterstützen. Ihr grep ist ein bisschen mir fremd, damit ich weiß nicht, was Ihre Umgebung ist, aber ich könnte versuchen, diese:

#!/bin/bash 
for file in "/home/osboxes/Parkhom"/* 
do 
    if grep -qP '[\0x80-\0xFF]' $file; then 
    [ -e "$1" ] && mv $file $1 
    fi 
done 

Die -q Option bedeutet, ruhig sein, geben nur einen Return-Code, zeigen nicht die Spiele . (Es könnte -s in Ihrem grep sein.) Der Rückkehrcode wird direkt durch die if Anweisung geprüft (keine Notwendigkeit, [ oder test zu verwenden). Die && in der nächsten Zeile ist nur eine schnelle Art zu sagen, ob die linke Seite wahr ist, dann führen Sie die rechte Seite aus. Sie können dies auch als if-Anweisung formulieren, wenn Sie das klarer finden. [ ist ein Synonym für test. Persönlich, wenn $1 ein Verzeichnis ist und sich nicht ändert, würde ich es einmal am Anfang des Skripts anstatt für jede Datei überprüfen, es wäre schneller.

+0

vielen Dank für die Hilfe! –

0

Wenn Sie möchten, dass Sie wissen möchten, ob etwas keine einfache Textdatei ist, können Sie den Befehl file verwenden, der Informationen über den Typ einer Datei zurückgibt.

[[ ! $(file -b "$file") =~ (^|)text($|) ]] 

Die -b sagt einfach, es nicht zu stören, den Dateinamen zurückzugeben.

Der zurückgegebene Wert wird so etwas wie:

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 

Der reguläre Ausdruck überprüft, ob die zurückgegebene Datei-Informationen das Wort „Text“ enthalten, dass für alle Klartextdateitypen enthalten ist.

Sie können stattdessen für bestimmte Dateitypen wie "ASCII-Text" filtern, wenn das alles ist, was Sie brauchen.

Verwandte Themen