Почему 'глава' не хочет давать мне имя файла сверху списка 'находки'?

Я должен выбрать наименее недавно играемый звуковой файл из одного каталога и поместить его в другого. Я попробовал:

find /home/carl/music/rock/SE/ -name "*_" -printf '%A@ %p\n' | sort -n | head -n 1 -exec cp {} /home/carl/playout_rock_SE/ \;

Я добираюсь:

head: invalid option - - ’e’
1
задан 31 December 2016 в 00:17

2 ответа

Вот альтернатива, которая избегает head луг и sed луг (и должно также быть безопасно для любых легальных имен файлов):

find /home/carl/music/rock/SE/ -name "*_" -printf '%A@\t%p\0' |
  sort -znk1,1 | { read -r -d '' t f; cp -v -- "$f" "/home/carl/playout_rock_SE/" ; }
3
ответ дан 3 December 2019 в 06:38

Если вы используете трубу, команда до того, как труба будет закончена. Вы не можете возобновить свою команду find с -exec на другой стороне. Команда head считает, что -exec представляет собой серию опций для нее, но у нее нет такой опции, как -e, поэтому «недопустимая опция»

Если в ваших именах файлов нет пробелов или других странных символов. символы, вы должны иметь возможность управлять следующим образом:

find /home/carl/music/rock/SE/ -name "*_" -printf '%A@ %p\n' | sort -n | head -n 1 | sed 's/.* //' | xargs -p -I '{}' cp -v -- '{}' /home/carl/playout_rock_SE/
  • sed 's/.* //' удаляет временную метку теперь, когда мы выбрали файл (это удаляет все до первого пробела включительно)
  • -p интерактивный - подтвердите перед выполнением команды
  • -I replace string - чтобы мы могли поместить имя входного файла перед адресатом, чтобы дать cp правильный синтаксис
  • [ 1115] cp -v -- расскажет нам, что копируется, и обработайте что-либо после этого как аргумент, даже если это выглядит как опция

Однако я рекомендую использовать гораздо более надежный ответ steeldriver [ 1111] вместо;)

2
ответ дан 3 December 2019 в 06:38

Другие вопросы по тегам:

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