Самый простой способ сделать это, IMO, - сделать так, чтобы ваш локальный преобразователь также выполнял рекурсивные поиски. Вы настраиваете свой локальный преобразователь с IP-адресами преобразователей вашего интернет-провайдера, а затем настраиваете все свои клиенты только с локальным. Он ответит собственной информацией, если она у него есть, и временные потери при прохождении через сервер в локальной сети незначительны.
Проблема в ./secondpart.sh: line 8
, которая должна установить $filename
.
stat
и rm
используют $filename
в качестве аргумента, поэтому они жалуются. Эти ошибки следуют -ups.
Итак, вам нужно исправить строку 8.
Вы почти всегда должны иметь set -euo pipefail
в начале ваших сценариев, чтобы позволить им завершиться при первой ошибке и, таким образом, предотвратить последующие -ошибки.
Но в целом ваш сценарий слишком сложен, использование wc
, цикла for
и sed
не является правильным способом чтения файла построчно .
И вместо использования stat -c %s
для определения того, равен ли размер файла нулю, вы можете использовать оператор проверки файла -s
, который делает именно то, (фактически проверяя обратное, если размер файла не ноль ).
Используйте, например,.:
xargs -a filenames.txt -I{} sh -c '[ -s "$1" ] || rm -i "$1"' xargs-sh {}
или
readarray filenames < filenames.txt
for filename in "${filenames[@]}"; do
[ -s "$filename" ] || rm -i "$filename"
done
или
while IFS= read -r filename; do
[ -s "$filename" ] || rm -i "$filename"
done < filenames.txt
Как правило, располагать имена файлов построчно в текстовом файле — не очень хорошая идея, поскольку имена файлов могут содержать символы новой строки в своем имени. Вместо этого вы всегда должны использовать нулевой символ(\0
)в качестве разделителя файлов.