Другое использование grep

Вы должны использовать -exec здесь:

find . \( -name '*.mp4' -o -name '*.mkv' -o -name '*.avi' \) \
    -exec sh -cf 'IFS=._
    for f do d=${f%/*} f=${f##*/}
    [ -n "${f##*_*}" ] && continue
    set -- $f 
    printf "%s\n" "mv \\" "$d/$f \\" "$d/$*"
    done' find.rename.shc {} +

Как написано, это только печатает команду, которую она выполнит, если вы ее выполните. Например, запустив вышеописанную команду в моем каталоге .../media/Videos распечатает что-то из следующего:

mv \
/mnt/bcache/media/Videos/TV/Adventure_Time/Adventure_Time.s05e37.The_Box_Prince.mp4 \
/mnt/bcache/media/Videos/TV/Adventure_Time/Adventure.Time.s05e37.The.Box.Prince.mp4
mv \
/mnt/bcache/media/Videos/TV/Adventure_Time/Adventure_Time.s05e38.Red_Starved.mp4 \
/mnt/bcache/media/Videos/TV/Adventure_Time/Adventure.Time.s05e38.Red.Starved.mp4

Для того, чтобы пройти через это, вам нужно изменить:

...
set -- $f
printf "%s\n" "mv \\" "$d/$f \\" "$d/$*"
...

...просто...чтобы...

...
set -- $f; mv "$d/$f" "$d/$*"
...

В общем случае, следует избегать передачи имен файлов и тому подобного через канал, так как при этом вы теряете разделители к голове и хвосту имени файла - он перестает быть аргументом и становится вместо этого последовательностью байт в потоке. Опция -exec для find позволяет вам сохранить эти разделители в дочернем процессе выполняющегося процесса find. С опцией + он действует как xargs - выполняя заданный дочерний процесс только так часто, как это необходимо, чтобы избежать условия ARGMAX.

Что касается проблемы sed - вы можете попробовать:

LC_ALL=C xargs sed ...

Это должно, по крайней мере, избежать интерпретации объявления переменной окружения как аргумента xargs. Однако это не поможет вам отредактировать имена файлов.

Последнее замечание - проблема, о которой вы упоминаете, как правило, вызвана неполной многобайтовой последовательностью, возникающей в пространстве шаблонов. POSIX указывает, что . не может совпадать с частью символа - и поэтому .* теряет свое значение в этом контексте. Принудительное использование локали C должно ее разрешить - но другой вариант очистки пространств удержания/маскировки с помощью GNU sed - это команда z.

0
13.01.2015, 17:11
1 ответ

Вот хорошая маленькая страница на Shellhacks.com, которые показывают примеры ", используя bash" rerep или / grep и / grep, а не ", , и ] Это имеет SED и эквиваленты . Я вставлю его здесь, вы могли бы использовать их для поиска $ TUBLIC и / или / нет . В $ пример , в определенном или любом порядке.

Использование Bash «GreeP или / GREP и / GREP не» не «Операторы

в следующей статье вы найдете несколько примеров, которые показывают, как использовать или / и / не операторы с помощью команд Linux GREP / SED / AWK.

Это довольно распространенная задача использовать такие инструменты командной строки Linux как GREP, SED и AWK для , разбирающихся файлы с регулярными выражениями .

Я покажу, как Найти все строки , что содержит любой из нескольких шаблонов , как распечатать все строки в файле, что соответствует нескольким шаблонам И как найти и распечатать все строки, что не совпадает с рисунком .

GREP 'или «Оператор

Найти все строки в файле, который соответствует любому из следующих шаблонов.

Использование команды GREP:

grep "pattern1\|pattern2" file.txt
grep -E "pattern1|pattern2" file.txt
grep -e pattern1 -e pattern2 file.txt
egrep "pattern1|pattern2" file.txt

Использование команды AWK:

awk '/pattern1|pattern2/' file.txt

Использование команды SED:

sed -e '/pattern1/b' -e '/pattern2/b' -e d file.txt

GREP 'и «Оператор

Найти и распечатать все строки в файле, что соответствует нескольким шаблонам.

Использование команды GREP:

grep -E 'pattern1.*pattern2' file.txt # in that order
grep -E 'pattern1.*pattern2|pattern2.*pattern1' file.txt # in any order
grep 'pattern1' file.txt | grep 'pattern2' # in any order

Использование команды awk:

awk '/pattern1.*pattern2/' file.txt # in that order
awk '/pattern1/ && /pattern2/' file.txt # in any order

Использование команды SED:

sed '/pattern1.*pattern2/!d' file.txt # in that order
sed '/pattern1/!d; /pattern2/!d' file.txt # in any order

GREP 'Не «Оператор

Найти и распечатать все строки, которые не соответствуют шаблону.

Использование команды GREP:

grep -v 'pattern1' file.txt

Использование команды AWK:

awk '!/pattern1/' file.txt

Использование команды SED:

sed -n '/pattern1/!p' file.txt

Вот ссылка на Руководство GREP . У него много хорошей информации, в том числе на регулярных выражений и некоторые примеры примеров использования .

Эта страница представляет собой «чит-лист» на Regex .

2
28.01.2020, 02:36

Теги

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