найти xargs rm с шаблоном имени файла в переменной

Вы также можете сделать это с помощьюcut:

cut -d' ' -f1,2,12- ${YOUR_LOG_FILE}

Или (безопаснее):

cat ${YOUR_LOG_FILE} | tr -s " " | cut -d' ' -f1,2,11-
3
04.04.2020, 22:57
1 ответ

Назначение вашего массива,

TXT=(*.txt)

расширит шаблон *.txtдо списка имен файлов в текущем каталоге, который соответствует этому шаблону. Оболочка будет делать это во время назначения. Это не то, что вы хотите. Вы хотите дать findлитеральную строку *.txt, вот так:

pattern='*.txt'
find /directory -type f -name "$pattern" -exec rm {} +

Здесь я также избавился от xargs rmи вместо этого выполняю rmнепосредственно из find. Большинство современных реализаций findмогут использовать нестандартный --deleteвместо -exec rm {} +:

.
pattern='*.txt'
find /directory -type f -name "$pattern" -delete

Обратите внимание, что здесь нет необходимости в цикле, поскольку мы имеем дело только с одним шаблоном. Также обратите внимание, что цитирование "$pattern"в вызове findважно, иначе шаблон будет заменен всеми соответствующими именами файлов в текущем каталоге до запуска find.

Для нескольких паттернов вы можете сделать такой цикл:

patterns=( '*.txt' '*.tmp' )
for pattern in "${patterns[@]}"; do
    find /directory -type f -name "$pattern" -delete
done

Заключение в кавычки при назначении массива имеет важное значение, поскольку оно не позволяет оболочке использовать шаблоны в качестве шаблонов подстановки имен файлов тут же. Цитирование "${patterns[@]}"и "$pattern"также важно по той же причине.

Другой подход заключается в том, чтобы сделать только один вызов find, даже если у вас есть несколько шаблонов. Это значительно ускорит работу, если /directory— большая иерархия каталогов. Следующий код делает это, создавая массив тестов -nameдля findдля использования :

.
patterns=( '*.txt' '*.tmp' )

name_tests=( )
for pattern in "${patterns[@]}"; do
    name_tests+=( -o -name "$pattern" )
done

# "${name_tests[@]:1}" removes the initial "-o", which shouldn't be there.
name_tests=( '(' "${name_tests[@]:1}" ')' )

find /directory -type f "${name_tests[@]}" -delete

В приведенном выше сценарии фактическая команда, выполняемая в конце, будет

find /directory -type f '(' -name '*.txt' -o -name '*.tmp' ')' -delete

... который удалит все обычные файлы с суффиксами имен файлов.txtили.tmpв любом месте каталога /directoryили ниже него.

7
28.04.2021, 23:18

Теги

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