SED или AWK, чтобы удалить все до первого тире и после последнего

Самый простой способ сделать это, IMO, - сделать так, чтобы ваш локальный преобразователь также выполнял рекурсивные поиски. Вы настраиваете свой локальный преобразователь с IP-адресами преобразователей вашего интернет-провайдера, а затем настраиваете все свои клиенты только с локальным. Он ответит собственной информацией, если она у него есть, и временные потери при прохождении через сервер в локальной сети незначительны.

-2
22.05.2019, 11:05
1 ответ

Проблема в ./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)в качестве разделителя файлов.

1
28.01.2020, 05:16

Теги

Похожие вопросы