Як перемістити перші x файли


21

У мене є ця величезна папка з тисячами не упорядкованих файлів. Чи можливо перемістити перші 5000 в підпапку за допомогою mvкоманди? Зараз я переміщую файли за допомогою

 mv *some_pattern* ./subfolder1/

Що стосується зараз, я переміщу зображення досить випадковим чином, це не дуже важливо, якщо в кожній підпапці немає точно 5000 файлів. Чи є кращий спосіб це зробити?


Відповіді:


23
mv `ls | head -500` ./subfolder1/

12
(Передбачається , що жоден з імен файлів не містять пробіл, табуляції, переклад рядка, зірки, відкриті квадратні дужки, знаки питання знака або почати з -або .і припускаючи subfolder1себе не проявляє в цьому списку.)
Stéphane Chazelas

@ StéphaneChazelas, якщо файл містить ці, як ми модифікуємо команду?
Peiti Li

$ 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

Якщо ви занадто довго отримуєте помилку щодо списку аргументів . Ви можете використовувати команду zshbuitin 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 True. Це не повне рішення, а лише метод вирішення проблеми.
Карлсон

3
  1. Перейдіть у каталог, з якого потрібно перемістити файли
  2. запустити нижче команди

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

У findкоманді .(крапка) позначає поточний каталог

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


1

Мені вдалося зробити крок на 50 000 без помилки башти МВ, як це

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

Досить смішно, це було на спільній частці самби, тому обмеження в 50 к. Полягає в тому, що графічний інтерфейс Windows Explorer не любить більше, ніж 60 к. Файлів у dir.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.