Cách di chuyển các tệp x đầu tiên


21

Tôi có thư mục khổng lồ này với hàng ngàn tệp không có thứ tự. Có khả thi để chuyển 5000 đầu tiên sang thư mục con thông qua mvlệnh không? Bây giờ tôi di chuyển các tập tin với

 mv *some_pattern* ./subfolder1/

Hiện tại, tôi di chuyển hình ảnh khá ngẫu nhiên, nó không thực sự quan trọng nếu không có chính xác 5000 tệp trong mỗi thư mục con. Có cách nào tốt hơn để làm điều đó?


Câu trả lời:


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

12
(giả sử không có tên tệp nào chứa không gian, tab, dòng mới, ngôi sao, dấu ngoặc vuông mở, ký tự dấu hỏi hoặc bắt đầu bằng -hoặc .giả sử subfolder1chính nó không hiển thị trong danh sách đó.)
Stéphane Chazelas 13/12/13

@ StéphaneChazelas nếu tệp chứa những thứ đó, làm thế nào để chúng ta sửa đổi lệnh?
Peiti Li

$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Brian Thomas

15

Với zsh:

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

Để di chuyển tới 5000 tệp thông thường theo thứ tự chúng nằm trong thư mục.

Đối với 5000 đầu tiên trong danh sách được sắp xếp theo từ vựng:

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

Nếu bạn nhận được một lỗi về danh sách arg quá lâu . Bạn có thể sử dụng lệnh zshbuitin mvbằng cách ban hành:

zmodload zsh/files

Đầu tiên.

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/

2
Đoạn mã POSIX là một viên đá quý
iruvar

Nếu tôi gặp lỗi khi sử dụng bash thì sao?
Brian Thomas

8

Một phiên bản đơn giản và hỗ trợ ký tự đặc biệt, dấu cách, v.v.

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

Để điều này hoạt động như là dir2phải tồn tại và bạn phải thực thi nó từ thư mục mẹ của dir1dir2.

Điều này sẽ di chuyển 1000 tệp từ dir1 sang dir2.


tốt đẹp ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ để di chuyển 1000 tệp lớn nhất trong dir1 (-S liệt kê tệp theo kích thước)
oneklc

1
Lưu ý rằng ls -Qkhông tạo ra đầu ra tương thích với xargsđịnh dạng đầu vào dự kiến. Nó giúp cho tên tệp chứa ký tự khoảng trắng, nhưng không phải là dấu ngoặc kép hoặc dấu gạch chéo ngược và tác hại đối với tên tệp chứa ký tự điều khiển bao gồm TAB.
Stéphane Chazelas

3

Bạn có thể cần phải làm một cái gì đó như thế này:

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

Kịch bản này hoạt động trong các biến thể bash, ksh, sh và nhiều UNIX.


1
(với điều kiện không có tên tệp nào chứa không gian, tab, dòng mới, ngôi sao, dấu ngoặc vuông mở, ký tự dấu hỏi hoặc bắt đầu bằng - hoặc. và cung cấp destinationchính nó không hiển thị trong danh sách đó.)
Stéphane Chazelas 13/12/13

@StephaneChazelas Đúng. Đây không phải là một giải pháp hoàn chỉnh chỉ là một phương pháp xử lý vấn đề.
Karlson

3
  1. Xem thư mục mà bạn muốn di chuyển tệp từ
  2. chạy bên dưới lệnh

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

Trong findlệnh, .(dấu chấm) biểu thị thư mục hiện tại

tìm thấy các tệp bắt đầu bằng Hello và kết thúc bằng gz, 5000 tệp đầu tiên sẽ được chuyển đến đường dẫn /data01/path/


1

Tôi đã có thể thành công trong một động thái 50.000 mà không gặp lỗi mv bash như thế này

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

Hài hước lắm, đây là một chia sẻ samba, vì vậy giới hạn 50 nghìn là vì GUI Windows Explorer không thích hơn 60k tệp trong một thư mục nói chung.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.