Находясь в меню bash, выбрать параметр, чтобы пользователь мог ввести пользовательскую команду?

Никогда не рекомендуется использовать вывод lsдля чего-либо, кроме просмотра в терминале. См. Почему не разборls(и что делать вместо )? . Вместо этого используйтеfind:

find /home/balaji/work/ -type f -printf '%C@\t%p\0' |
  sort -z -k1,1 -r -n |
  cut -z -f2 |
  head -z -n 10 | 
  xargs -0r echo mv -t /home/balaji/regular_archive/

Для этого требуются версии GNU find, sort, cut, tailиxargs(или, по крайней мере, другие их версии, поддерживающие параметр -zдля разделителей записей NUL ). ].

  • findиспользует -printf '%C@\t%p\0'для перечисления последних -измененных меток времени (%C@, в секундах с начала эпохи 1970 -01 -01 00 :00 :00 )и имен файлов(%p)всех обычных файлов. Поля разделены одной вкладкой (\t), а каждая запись разделена символом NUL (\0)
  • .
  • вывод find направляется в sort для обратной сортировки(-r)файлов численно(-n)только по первому полю(-k 1,1)--т. е. по метке времени.
  • вывод sort направляется в cut для удаления поля метки времени (он нам больше не нужен после того, как мы закончили сортировку)
  • вывод cut направляется в headдля получения первых десяти записей
  • и, наконец, выходные данные head передаются в xargsдля выполнения команды mv. При этом используется расширение GNU -tдля mv, так что целевой каталог может быть указан перед именами файлов.

На самом деле, это работает echo mv, а не mv, так что это пробный -запуск. Избавьтесь от echo, если вы уверены, что он будет делать то, что вам нужно.

Примечание :Это будет работать с любыми именами файлов, независимо от того, какие странные и раздражающие символы они могут содержать (, например. пробелы, новые строки, метасимволы оболочки и т. д. ). Кроме того, команда fileимеет много других опций, которые можно использовать для уточнения критериев поиска.


Если у вас старая версия GNU coreutils (, то есть cut, ни head, ни tailне будут иметь опции -z. Вместо этого вы можете использовать awk. например.

find /home/balaji/work/ -type f -printf '%C@\t%p\0' |
  sort -z -k1,1 -r -n |
  awk -F '\t' 'BEGIN {RS=ORS="\0"}; NR<=10 { $1=""; $0=$0; $1=$1 ; print }' |
  xargs -0r echo mv -t /home/balaji/regular_archive/

В качестве альтернативы вы можете использовать perlвместоawk:

 perl -F'\t' -0lane 'if ($. <= 10) {delete $F[0]; print @F}'

0
16.01.2021, 16:15
1 ответ

Вы можете сделать что-то вроде

read -p 'Cmd? ' cmd
eval $cmd
  
0
18.03.2021, 22:36

Теги

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