Как переместить первые x файлы

21

У меня есть эта огромная папка с тысячами неупорядоченных файлов. Возможно ли переместить первые 5000 в подпапку с помощью mvкоманды? Сейчас я перемещаю файлы с

 mv *some_pattern* ./subfolder1/

На данный момент я перемещаю изображения совершенно случайно, это не очень важно, если в каждой подпапке нет ровно 5000 файлов. Есть ли лучший способ сделать это?

Fabinout
источник

Ответы:

23
mv `ls | head -500` ./subfolder1/
schaiba
источник
12
(при условии, что ни одно из имен файлов не содержит пробела, табуляции, новой строки, звезды, открытой квадратной скобки, символов вопросительного знака или начинается с -или, .и предполагается, что subfolder1само по себе не отображается в этом списке.)
Стефан Шазелас
@ StéphaneChazelas, если файл содержит их, как мы можем изменить команду?
Пейти Ли
$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Брайан Томас
15

С zsh:

mv -- *(D.oN[1,5000]) ./subfolder1

Для перемещения нужно до 5000 обычных файлов в порядке их нахождения в каталоге.

Для первых 5000 в лексикографически отсортированном списке:

mv -- *(D.[1,5000]) ./subfolder1

Если вы получите ошибку о списке аргументов слишком долго . Вы можете использовать команду zsh'buitin', выполнив mv:

zmodload zsh/files

первый.

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/
Стефан Шазелас
источник
2
Фрагмент POSIX - драгоценный камень
iruvar
что если я получу ошибку, используя bash?
Брайан Томас
8

Версия, которая проста и поддерживает специальные символы, пробелы и т. Д.

ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/

Чтобы это работало как есть, оно dir2должно существовать, и вы должны выполнить его из родительского каталога dir1и dir2.

Это переместит 1000 файлов из dir1 в dir2.

Луис Антолин Кано
источник
хороший! ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ для перемещения 1000 самых больших файлов в dir1 (-S список файлов по размеру)
oneklc
1
Обратите внимание, что ls -Qвыходной сигнал не совместим с xargsожидаемым форматом ввода. Это помогает для имен файлов, содержащих пробелы, но не для двойных кавычек или обратной косой черты и вреда для имен файлов, содержащих управляющие символы, включая TAB.
Стефан Шазелас
3

Возможно, вам нужно сделать что-то вроде этого:

x=1
for file in *
do
    if [ "X$x" = "X#####" ]; then
        break
    fi
    mv $file <destination>
    x=`expr $x + 1`
done

Этот скрипт работает в bash, ksh, sh и нескольких вариантах UNIX.

Карлсон
источник
1
(при условии, что ни одно из имен файлов не содержит пробела, табуляции, новой строки, звезды, открытой квадратной скобки, символов вопросительного знака или начинается с - или. и при условии, что destinationсамо по себе не отображается в этом списке.)
Стефан Шазелас
@StephaneChazelas Правда. Это не полное решение, просто метод решения проблемы.
Карлсон
3
  1. Перейдите в каталог, из которого вы хотите переместить файлы
  2. запустить ниже команды

    find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/ 

В findкоманде .(точка) обозначает текущий каталог

находит файлы, которые начинаются с Hello и заканчиваются gz, первые 5000 файлов будут перемещены в путь /data01/path/

Пратик Хиремат
источник
1

Я смог успешно сделать ход 50 000 без ошибки mv bash, как это

 ls | head -50000 | xargs -I{} sudo mv {} 01/

Как ни странно, это было на общем ресурсе samba, поэтому ограничение в 50 КБ связано с тем, что графический интерфейс Windows Explorer не любит более 60 КБ файлов в каталоге.

Брайан Томас
источник