рекурсивно удалить все файлы+папки, кроме определенного файла в Solaris

Поскольку это находится внутри file, быстрее использовать sed:

sed -i 's/[0-9]\{18,\}/-/g' file

Имейте в виду, что опция -iизменит ваш файл. Если вы хотите увидеть, что он делает перед фиксацией, удалите -i.

Обратите внимание, что в BSD -iдолжен иметь параметр, поэтому используйте:-i ''.

Awk тоже мог это сделать:

<file awk '{gsub("[0-9]{18,}", "-")}1'  >newfile
0
05.01.2021, 13:40
1 ответ

Когда вы используете -type f, вы говорите findи только рассматривать файлы и ничего больше. Так что это нормально, что это не удаляет каталоги. Чтобы избежать удаления самого /tmp/CURRENT/, вы можете попробовать несколько вещей:

  1. Если ваш findподдерживает-mindepth(GNU find— по умолчанию в системах Linux — имеет это, я не знаю, какие другие findверсии могут его поддерживать ), вы можете сообщить об этом только смотреть на вещи как минимум на один уровень ниже:

    find /tmp/CURRENT/  ! -name '104.tar' -mindepth 1 
    
  2. Используйте второй оператор !, чтобы исключить его:

    find /tmp/CURRENT/ ! -path /tmp/CURRENT/ ! -name '104.tar' 
    
  3. Просто используйте -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)
3
18.03.2021, 22:38

Теги

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