Вы также можете сделать это с помощьюcut
:
cut -d' ' -f1,2,12- ${YOUR_LOG_FILE}
Или (безопаснее):
cat ${YOUR_LOG_FILE} | tr -s " " | cut -d' ' -f1,2,11-
Назначение вашего массива,
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
или ниже него.