Переместить только последние 8 файлов в каталог в другой каталог

7

Я пытаюсь переместить последние 8 файлов из каталога Documents в другой каталог, но я не хочу переместить их один за другим в этот конкретный каталог. Можно ли переместить их с заменой команды tail , но для каталогов вместо файлов? Я хочу сказать, что я хотел бы сделать это с помощью tail -8 ./Documents | mv ./Anotherdirectory или mv tail -8 ./Documents ./Anotherdirectory .

На самом деле, я ищу умный способ, которым я мог бы перемещать последние 8 файлов (как указано в ls ) быстро (без ввода каждого имени) в другой каталог. Любые предложения?

    
задан Sandra Ross 15.11.2016 в 17:20
источник

3 ответа

7

Вы можете использовать for , который упорядочивается по файлам упорядоченным образом и позволяет избежать разбора вывода find или ls , чтобы избежать проблем с пробелами и другими специальными символами в именах файлов. Большое спасибо @muru за улучшение этого:)

i=0; j=$(stat ~/Documents/* --printf "%i\n" | wc -l); for k in ~/Documents/*; do if (( (j - ++i) < 8 )); then echo mv -v "$k" ~/AnotherDirectory; fi; done 

Сначала протестируйте его с помощью echo , затем удалите echo , чтобы фактически переместить файлы.

Как сценарий:

#!/bin/bash
i=0
j=$(stat ~/Documents/* --printf "%i\n" | wc -l )
for k in ~/Documents/*; do
  if (( (j - ++i) < 8 )); then
    echo mv -v -- "$k" ~/AnotherDirectory
  fi
done

, удалите echo после тестирования, чтобы переместить файлы для реальных

Объяснение

ответ дан Zanna 15.11.2016 в 19:25
источник
3

Вы можете делать такие вещи, используя команду substitution. В Bash:

mv $(ls -d [sort options] source/* | tail -n8) destination

$(command) будет запускать все, что заключено в нем, и заменить текст на внешнюю команду. Команда ls будет печатать путь к каждому файлу в исходном каталоге, отсортированном по указанным вами флагам, по одному на строку, поэтому tail может просто взять последние несколько. Таким образом, вышесказанное расширилось бы до

mv source/file1 source/file2 source/file3 ... source/file8 destination

Вы можете просто запустить ls -d [sort options] source/* | tail -n8 , чтобы посмотреть, какие файлы он будет копировать.

В зависимости от того, как вы заказываете вывод ls и именования файлов, вы можете сделать то, что ищете более просто, просто используя некоторый вариант mv source/name_* destination , чтобы скопировать все, начиная с «name_ "в каталог назначения.

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

ls -d1 [sort options] source/* | tail -n8 | tr '\n' '%pr_e%' | xargs --null mv -t destination

, хотя он по-прежнему использует синтаксический анализ ls для сортировки в любом порядке, который не является алфавитным.

    
ответ дан t-mager 15.11.2016 в 18:18
1

похож на предложение t-mager, вы можете использовать опции сортировки ls и захватить последние 8 файлов в список, и это ваши файлы:

1 10 2 3 4 5 6 7 8 9

используйте следующую команду:
for n in 'ls|tail -8'; do mv $n ~/temp; done

    
ответ дан xortion 17.11.2016 в 20:02