Как мне прочитать каждый файл и распечатать имя файла перед его чтением?

2

Я старался

$ find Music -exec cp -v {} \>/dev/null \;

Получил ошибку

'Music/AlbumArtSmall.jpg' -> '>/dev/null'
cp: cannot create regular file '>/dev/null': No such file or directory

Я старался

$ find Music -exec echo {} && echo cp {} \>/dev/null \;
find: missing argument to `-exec'

А также

$ find Music -exec echo {} \\; echo cp {} \>/dev/null \;
find: missing argument to `-exec'

А также

$ find Music -exec echo {} \&\& cp {} \>/dev/null \;
Music && cp Music >/dev/null
...

Я старался

$ find Music -exec bash -c 'echo "{}" && echo cp \"{}\" /dev/null' \;
Music/4-Mat - Intro Music.mp3
cp "Music/4-Mat - Intro Music.mp3" /dev/null

Похоже, это будет работать, но это дало

$ find Music -exec bash -c 'echo "{}" && cp \"{}\" /dev/null' \;
Music/4-Mat - Intro Music.mp3
cp: target '/dev/null' is not a directory

Когда я взял второй эхо.

Вот похожий, но не тот же вопрос: find с exec: как выполнить многоступенчатое условное действие для каждого файла

Chloe
источник
Это Linux, чтобы скопировать файл в / dev / null cat: cat {} >/dev/null, Вы также можете использовать dd: dd if={} of=/dev/null,
xenoid

Ответы:

5

Вы, кажется, обошли дома, не получив правильную комбинацию:

find Music -exec cp -v {} /dev/null \;

Вам нужно как минимум два параметра для cp, источник (ы) и одна цель, которая может быть файлом или каталогом. Когда ты убегаешь > вы удаляете его свойства перенаправления, так >/dev/null затем становится целью, ища подкаталог в текущем каталоге.

Обратите внимание, что вы не можете указать отдельные перенаправления с -exec опция: параметры передаются непосредственно в запланированную программу без дальнейшей интерпретации оболочки.

Для себя я вообще предпочитаю эту конструкцию -exec:

find Music | while read -r l; do cp -v "$l" /dev/null; done

Затем я могу использовать все обычные команды оболочки в while предложение, включая несколько команд, перенаправления и т. д.

Обратите внимание, что определенные символы в именах файлов (например, внедренные новые строки или начальные и конечные пробелы) будут препятствовать работе этого решения, пока оригинал -exec Ответ должен работать для всех имен файлов. У меня нет таких имен файлов, отсюда и мои предпочтения.

AFH
источник
Может быть достаточно, но не совсем надежно: (1) find … | while read … потерпит неудачу, если есть новая строка в имени файла ( -exec лучше); (2) если где-то есть пустой именованный канал, cp будет глохнуть, пока труба не будет записана ( find -type f … помог бы). Я все еще думаю, что это хороший ответ (+1 между прочим), однако хорошо знать возможные подводные камни. Этот комментарий должен указать на некоторые из них.
Kamil Maciorowski
1
@KamilMaciorowski - Файлы со встроенными новыми строками вызовут всевозможные проблемы, и я не могу представить никого, кто когда-либо использовал бы такие имена, кроме случайно созданных, и маловероятно, что музыкальные треки будут включать такие. Мой предпочтительный метод также терпит неудачу с начальными и конечными пробелами, но это обходится с while read -r; do cp -v "$REPLY" /dev/null; done - Я использую это при создании сценариев, но не в специальных командах. Я не хотел усложнять ответ, рассматривая такие крайние случаи.
AFH