Как получить относительные пути с помощью ls?

8

Я хотел бы сделать что-то вроде этого, чтобы переместить последние два загруженных файла:

mv ` ls -rt ~/Downloads/ | tail -2 ` .

К сожалению, lsтолько дает имена файлов. Как я могу адаптировать код выше?

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

Тим
источник
9
Используйте findвместо этого.
Игнасио Васкес-Абрамс

Ответы:

10

Итак, если вы не откажетесь ls, то, по крайней мере, попытайтесь избавиться от привычки использовать кавычки для всего, особенно когда xargsэто лучше подходит:

ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .
geocar
источник
Ваш xargsрадует меня больше, чем спины. Но есть ли какая-либо техническая причина, чтобы предпочесть эту последовательность труб, а не xargsиспользование обратных кавычек, или это только вопрос вкуса?
чудо173
В этом случае мы рассматриваем только два файла, но если мы хотим переместить тысячи файлов, мы можем случайно попытаться создать слишком длинную командную строку.
Геокар
Также: в случае нескольких сотен файлов мы можем начать работу немедленно. С обратными галочками мы должны дождаться завершения всей подкоманды.
Геокар
Также: когда вам удастся lsxargs -0
избавиться
3
Разбор lsне рекомендуется: mywiki.wooledge.org/ParsingLs
Gilles Quenot,
8

Вы можете использовать GNU findтам:

mv $(find ~/Download -mindepth 1 -maxdepth 1 -printf '%Ts %p\n' | sort -n | cut -d ' ' -f2- | tail -n 2) .

В find -printfопции:

  • %Tsотображать время как эпоху
  • %p путь к файлу

Видеть man find | less +/'^ *-printf'

редактировать

если вам нужно иметь дело с пробелами в именах файлов, я рекомендую это другое решение:

find -maxdepth 1 -printf '%Ts %p\n' |
    sort -n |
    cut -d ' ' -f2- |
    tail -n 2 |
    xargs -i% mv % .
Жиль Квено
источник
Добавлены пояснения по find -printfопциям
Gilles Quenot
1
Мне любопытно: есть ли какая-то конкретная причина использовать -f2-вместо -f2как вариант cut? Для чего второй тире?
Франческо Турко
1
Конечно, Франческо Турко, как и было сказано man cut, печатает до конца, если есть более одного столбца.
Жиль Квено
POST отредактирован для работы с именами файлов с пробелами.
Жиль Квено
3

Используйте ls -rt ~/Downloads/*вместо ls -rt ~/Downloads/. В ls -rt ~/Downloads/*аргументе строка сначала раскрывается оболочкой (это называется глобализацией имени файла ). Таким образом, вы получаете список путей в качестве аргументов для ls -rtкоманды, который затем сортирует его так, как вы указали в параметрах ls. Напротив, команда ls -rt ~/Downloads/читает содержимое каталога ~/Downloads/. Это список файлов без пути к каталогу.

miracle173
источник
2

С зш:

mv ~/Downloads/*(.om[1,2]) .

(...)Часть называется подстановкой классификаторов , одна из особенностей убийцу zsh. Каждый квалификатор (обычно отдельные символы) позволяет фильтровать сопоставленные записи на основе атрибутов файлов (тип, размер, время ...), изменять порядок их расширения или изменять способ их расширения.

Выше у нас есть:

  • . (точка): выберите только обычные файлы (не каталоги, символические ссылки ...)
  • om: О rder списка по м времени odification.
  • [1,2]: выберите только первые две записи.

Также обратите внимание, что команда не будет выполнена, если нет совпадения (где другие оболочки могут случайно переместить неправильный файл / каталог).

Стефан Шазелас
источник