find
Некоторые полезняшки про одну из базовых штук.
Перекодировать многа файлов
find ./ -type f -exec bash -c 'enconv "{}"' \;
или, если те, что с конкретным расширением, и другим способом скармливая имена (чтоб не бояться, скажем, кавычки в имени файла):
find ./ -iname \*.txt -print0 | xargs -0 -n 1 enconv
Опция -exec для выполнения команд. Как и xargs, умеет подставлять имя найденного файла на место «{}». Вариант -execdir позволяет запускать команду из каталога, где находится файл (так, мне было существенно для unrar, чтоб файл разархивировался туда, где лежал архив, а не туда, откуда запущен find).
«\;» после -exec - не обязательно конец общей команды, можно добавлять ещё -exec, можно добавлять другие варианты операций. А вот объединять команды через &&
или &
- не срабатывало.
find ./ -iname \*.txt -exec enconv "{}" \; -print
или
find ./ -iname \*.rar -execdir unrar e -y "{}" \; -print -delete
Найти в папке муз все файлы mp3 и обработать их mp3gain, причём на все вопросы mp3gain отвечать "нет".
find ~/mus -iname '*mp3' -exec mp3gain -r '{}' <~/bin/no \;
Удалить пустые папки
sudo find /library/filosofia/ -type d -empty -delete
Замена во многих файлах
Собстно замена
awk '{sub(/blue/,"azure")}1' input.txt sed 's/blue/azure/' input.txt perl -ne 's/blue/azure/;print $_' input.txt perl -i -pe 's/foo/bar/g' ./*
(perl - так, к слову)
find по мотивам соседнего:
find ./ -iname \*.fb2 -print0 | xargs -0 -n 1 sed -n -i 's/encoding="windows-1251"/encoding="utf-8"/'
Если нужны бэкапы, то после -i идёт желаемый суффикс бэкапного файла.
Обнуляет файлы нафиг, если поставить кавычки после -i ((
- Развесисто и можно поразбираться: http://unix.stackexchange.com/questions/112023/how-can-i-replace-a-string-in-a-files/112024
- http://stackoverflow.com/questions/11392478/how-to-replace-a-string-in-multiple-files-in-linux-command-line
- http://askubuntu.com/questions/20414/find-and-replace-text-within-a-file-using-commands
Разгребать старое файло
find ./ -type f -atime +2500 > atimemore2500.txt
Что самое ужасное - такой поиск на 19 июня 2017 года дал результаты ) В смысле, у меня на жёстком диске таки реально были файлы с последним временем доступа больше 2500 дней. Вот настолько ненужные…
Надеюсь, постепенно получится уменьшить такое время-без-внимания.
find в полном объёме умеет работать со временем, позволяя искать по времени последнего доступа к файлу (-atime), времени последнего изменения файла (-mtime), или по времени его создания (-сtime). Специальные опции -amin, -cmin, -mmin, которые работают подобно выше рассмотренным, с той разницей, что в качестве параметров они принимают минуты, а не сутки.
Удалить файл со всеми хардлинками на него
find /home -xdev -samefile file1 -delete
или с пайпом и xargs
find /home -xdev -samefile file1 -print0 | xargs -0 rm
Обработать все файлы в папке
При необходимости перебрать все файлы в каком-либо каталоге и выполнить над ними какие-либо действия, можно воспользоваться простым однострочным циклом:
for file in /etc/config/*; do wc -l $file; stat -c %s $file; done
Можно использовать и find для рекурсивного поиска и дополнительных фильтров:
for file in `find /etc -type f -name "*.conf"` do wc -l $file; stat -c %s $file; done
Если выполняется не более одного действия над файлом, можно обойтись без цикла:
find /etc -type f | xargs wc -l
Если в именах файлов есть пробелы, то добавляем к find параметр -print0:
find /etc -type f -print0 | xargs -0 wc -l
Во всех примерах вычисляется количество строк в файлах. http://tt.erinome.net/2013/03/468
Или без пайпа, c exec. Переименовать файлы в папке и подпапках:
find ./ -name "*.abc" -exec rename 's/\.abc$/.edefg/' {} +
Альтернатива для find - fd
While it does not seek to mirror all of find's powerful functionality, fd provides sensible (opinionated) defaults for 80% of the use cases.
Features:
- Convenient syntax: ‘fd PATTERN’ instead of ‘find -iname 'PATTERN'’.
- Colorized terminal output (similar to ls).
- It's fast, often faster than find.
- Smart case.
- Ignores hidden directories and files, by default.
- Ignores patterns from your .gitignore, by default.
- Regular expressions.
- Unicode-awareness.
- Parallel command execution with a syntax similar to GNU Parallel.
Please note: the executable and the associated manpage were renamed from ‘fd’ to ‘fdfind’ because of a file name clash.
Домашняя страница: https://github.com/sharkdp/fd