правильный синтаксис:
awk 'END {print ARGC}' file1 ... filen
имейте в виду, что должен быть указан
, чтобы получить номер файла
awk 'END {print ARGC-1}' file1 ... filen
, бесконечный цикл
(это должно быть случайностью, так как ничто не дает подсказки относительно того, почему)
предположим, что вы пишете
foobar="/my/path1 /other/path2"
C=$(awk 'END{ print ARGC-1}' $fobar)
, вы, вероятно, пойдете в бесконечном цикле / ожидании для стандартного ввода, когда вы неправильно пишете $ foobar
как $ fobar
.
Просто используйте find
с -exec
:
find . -name '*bz2' -exec sh -c 'bzip2 -t "$0" 2>/dev/null || echo "$0 is corrupted"' {} \;
From man find
:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered. The string `{}'
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command [...]
Итак, приведенная выше команда find
, будет искать все файлы, заканчивающиеся на bz2
, и запускать небольшой скрипт sh
для каждого из них. {}
заменяется каждым найденным именем файла. Он передается в качестве 1-го параметра ( $ 0
) сценарию sh
, который запускает на нем bzip -t
и жалуется в случае сбоя. 2> / dev / null
отбрасывает любые другие сообщения об ошибках, чтобы все было в порядке.
В качестве альтернативы можно использовать оболочку. Если вы используете bash
, включите параметр globstar
, чтобы **
рекурсивно переходил в подкаталоги и проверял каждый файл bzip:
shopt -s globstar
for file in folder/**/*bz; do bzip2 -t "$file" || echo "$file is corrupted"; done
Используйте приведенный ниже сценарий.
cd folder
find -name "*.bz2" > bzipfiles
for i in `cat bzipfiles`
do
bzip2 -t $i
if [ $? == '0']
then
echo "$i file is not corrupted"
else
echo "$i file is corrupted"
echo "$i" >> corruptedfile_list
fi
done
Найдите поврежденный список файлов в correptedfile_list
.