Di chuyển một loạt các tập tin được đánh số?


14

Tôi đã nhận được 291 tệp được đánh số (bắt đầu từ 001 - tiêu đề và kết thúc ở 291 - tiêu đề) cần được chuyển vào các thư mục riêng biệt. (001 đến 021 đến thư mục 1, 022 đến 053 đến thư mục 2, chúng không nhất thiết phải có cùng số lượng tệp mỗi lần).

Tôi hình dung mình có thể làm điều đó theo cách xui xẻo như thế này: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Tôi gần như tích cực có một cách tốt hơn, vậy nó sẽ là gì?

EDIT: Vì vậy, nó sẽ hoạt động tốt, nhưng tôi nhớ ...

Tôi không bị kẹt khi sử dụng thiết bị đầu cuối, vì vậy tôi đã sử dụng trình quản lý tệp để nhấp và kéo. Câu hỏi vẫn đứng mặc dù.


1
Bạn muốn 21 thư mục con trong thư mục 1 và 22 thư mục trong thư mục 2?
Daniel Beck

Bạn đã xem xét unix.SE? Có một chủ đề hay về vấn đề này ở đây: unix.stackexchange.com/questions/12976/iêu
chrisjlee

@DanielBeck không, tôi muốn các tập tin di chuyển đến từng thư mục. Có một số lượng tệp khác nhau đi đến từng thư mục.
Cướp

@ ChrisJ.Lee Điều đó khá giống với những gì tôi đã làm / đã làm trước đây, tôi thích nó. Vì các tệp khớp với các tệp khác trong thư mục khác, tôi có thể ls -l | grep ^- | wc -llấy số dòng.
Cướp

1
@Rob Phải. Tuy nhiên, số lượng tập tin khác nhau vào mỗi thư mục. Tự động hóa điều đó (bao gồm các quy tắc) là nỗ lực nhiều hơn là tự làm một vài lần.
Daniel Beck

Câu trả lời:


25

Vì bạn đã nói không phải lúc nào cũng chính xác là 21 tệp mà bạn cần di chuyển các tệp theo cách thủ công và để thực hiện điều đó một cách hiệu quả, bạn có thể sử dụng mở rộng dấu ngoặc :

mv filename{001..21} dir1
mv filename{022..53} dir2
...

Có vẻ như nó có thể hoạt động, tôi sẽ thử.
Cướp

1
Điều này hoạt động hoàn hảo, nếu bạn thêm một ký tự đại diện sau dấu ngoặc. Đây chính xác là những gì tôi cần.
Cướp

2
Nếu số nằm ở giữa tên, bạn có thể viết file{001..21}name, bạn không phải sử dụng ký tự đại diện. Dù sao, hạnh phúc nó làm việc cho bạn.
drrlvn

1

Điều này sẽ di chuyển các tệp như bạn mô tả (ngoại trừ phạm vi thứ hai sẽ là 022 đến 042 cho 21 tệp thứ hai).

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done

Không phải lúc nào cũng là 21 tập tin, nhưng cảm ơn.
Cướp

0

Ý tôi là di chuyển rất nhiều tệp (như mười nghìn hoặc một triệu), shell sẽ phàn nàn về danh sách tệp quá lâu nếu bạn chỉ sử dụng {1..20}, vì vậy

Trong zsh , bạn có thể tải mv dựng sẵn:

setopt Extended_glob zmodload

zsh / tập tin

Sau khi làm điều đó, bạn có thể sử dụng lệnh như:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

hoặc nếu bạn đang viết một số kịch bản shell, bạn có thể làm một cái gì đó như thế này:

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

nếu bạn không sử dụng zsh, bạn có thể tham khảo /unix/128559/solve-mv-argument-list-too-long


Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. Câu trả lời nào bạn tham khảo là "câu trả lời chi tiết hơn"?
Ramhound

Điều này không thực sự trả lời câu hỏi vì OP muốn chuyển các tệp khác nhau sang các thư mục khác nhau.
DavidPostill
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.