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

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

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

7
задан 15 November 2016 в 12:39

4 ответа

Можно использовать 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 после тестирования для перемещения файлов для реального

Объяснение

7
ответ дан 23 November 2019 в 06:23

Вы можете делать такие вещи, используя подстановку команд. В 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_ «в каталог назначения.

РЕДАКТИРОВАТЬ: Вышеуказанное прерывается, когда в именах файлов есть пробелы. Более сложной альтернативой, которая решает эту проблему, будет

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

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

3
ответ дан 23 November 2019 в 06:23

подобный предложению 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

1
ответ дан 23 November 2019 в 06:23

Я нахожу, что это работает также: ls -1 [sort options] | tail -n2 | xargs -I {} -n 1 echo "mv \"{}\" ../t2/"

, Конечно, эхо должно быть удалено: ls -1 | tail -n2 | xargs -I {} -n 1 mv "{}" ../t2/

Эти "{}" может быть заменен '{}' На самом деле, как заключительный эксперимент, удалив (двойные) работы кавычек также. Удивление, но протестированный.

0
ответ дан 23 November 2019 в 06:23

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

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