Поскольку это находится внутри file
, быстрее использовать sed:
sed -i 's/[0-9]\{18,\}/-/g' file
Имейте в виду, что опция -i
изменит ваш файл. Если вы хотите увидеть, что он делает перед фиксацией, удалите -i
.
Обратите внимание, что в BSD -i
должен иметь параметр, поэтому используйте:-i ''
.
Awk тоже мог это сделать:
<file awk '{gsub("[0-9]{18,}", "-")}1' >newfile
Когда вы используете -type f
, вы говорите find
и только рассматривать файлы и ничего больше. Так что это нормально, что это не удаляет каталоги. Чтобы избежать удаления самого /tmp/CURRENT/
, вы можете попробовать несколько вещей:
Если ваш find
поддерживает-mindepth
(GNU find
— по умолчанию в системах Linux — имеет это, я не знаю, какие другие find
версии могут его поддерживать ), вы можете сообщить об этом только смотреть на вещи как минимум на один уровень ниже:
find /tmp/CURRENT/ ! -name '104.tar' -mindepth 1
Используйте второй оператор !
, чтобы исключить его:
find /tmp/CURRENT/ ! -path /tmp/CURRENT/ ! -name '104.tar'
Просто используйте -path
и ищите пути, начинающиеся с /tmp/CURRENT
и сопровождаемые хотя бы одним символом:
find /tmp/CURRENT/ -path '/tmp/CURRENT/?*' ! -name '104.tar'
Во всех трех случаях вы можете добавить -exec rm -r {} +
в конец команды для удаления совпадений.
Однако обратите внимание, что эти команды удалят все , кроме определенного файла /tmp/CURRENT/104.tar
. Поэтому, если у вас есть /tmp/CURRENT/dir1/104.tar
или любые другие файлы с именем 104.tar
в подкаталогах, они будут удалены. Если это не то, что вы хотите, отредактируйте свой вопрос, чтобы уточнить.
Конечно, если все, что вы хотите, это удалить все в /tmp/CURRENT
, кроме /tmp/CURRENT/104.tar
, вам вообще не нужно find
. Вы можете просто запустить это в bash:
shopt -s extglob
rm -r /tmp/CURRENT/!(104.tar)