2017-01-31 10 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

Это не ясно, какой из них вы после этого, но:

• Для того, чтобы проверить, если переменная$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

Итак, мой код будет выглядеть так? '#!/Bin/bash для файла в"/home/osboxes/Parkhom "/ * do if [-eq" $ (echo "$ (file $ file)" | grep -qP '[^ [: ascii:]] '"$ file") "]; затем если test -e "$ 1"; то мв $ файл $ 1 Fi фи сделали Выйдите 0' –

+0

спасибо большое Гриша) привет из России :) –

0

Первая проблема заключается в том, что ваш первый, если оператор имеет неверный пункт тестирования. Оператору -eq[ необходимо принять один аргумент до и после; ваш аргумент исчез или пуст.

Вторая проблема заключается в том, что я думаю, что echo является избыточным.

Третья проблема заключается в том, что команда file всегда имеет выход ASCII, но вы проверяете двоичный вывод, который вы никогда не увидите.

Использование file довольно умное для этого приложения, хотя есть два способа вы можете это сделать; file говорит, что различные вещи и то, что вас интересует, это data и ASCII, но не все файлы, которые не идентифицируются как data, являются ASCII, и не все файлы, которые не идентифицируются как ASCII, являются данными. Возможно, вам лучше пойти с оригинальной идеей использования 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 означает быть спокойным, только возвращает код возврата, не показывают матчи , (Это может быть -s в вашем grep.) Код возврата проверяется непосредственно оператором 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», если это все, что вам нужно.