Я должен выбрать наименее недавно играемый звуковой файл из одного каталога и поместить его в другого. Я попробовал:
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’
Вот альтернатива, которая избегает 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/" ; }
Если вы используете трубу, команда до того, как труба будет закончена. Вы не можете возобновить свою команду 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
правильный синтаксис cp -v --
расскажет нам, что копируется, и обработайте что-либо после этого как аргумент, даже если это выглядит как опция Однако я рекомендую использовать гораздо более надежный ответ steeldriver [ 1111] вместо;)