Làm cách nào để sắp xếp lại các tập tin vật lý `03.mp3 01.mp3 02.mp3` (` ls -f`) trong một thư mục?


11

Thứ tự vật lý của các tệp quan trọng khi tôi sao chép chúng vào thanh USB của mình và nghe trong máy nghe nhạc mp3 trên xe hơi. Hầu hết các thư mục album nhạc của tôi đều chưa được sắp xếp , ví dụ: ls -fcó thể tạo ra:
03.song3.mp3
01.song1.mp3
02.song2.mp3

Khi tôi sao chép thư mục đó vào thanh USB của mình, các tệp sẽ được sao chép theo thứ tự đó . Máy nghe nhạc mp3 trên xe hơi của tôi hiển thị các tập tin theo thứ tự chưa được sắp xếp, đây không phải là thứ tôi muốn. Sau đó tôi có thể sắp xếp lại các tệp trên thanh USB (xem: Cách sắp xếp lại các thư mục? (Như được hiển thị trong `ls -U`) ), nhưng có thể tránh điều đó hoàn toàn nếu tôi có thể sắp xếp lại chúng trong thư mục đó trên ổ cứng của mình (ext4 )? Có cách nào để làm điều đó?

(Không thực hiện được điều đó, có thể có cách viết findlệnh, lấy các tệp, sắp xếp chúng và sau đó sao chép chúng theo thứ tự ??) Bạn có đề xuất nào không?


Ngoài ra, bạn có thể sắp xếp các tệp sau khi sao chép chúng vào máy nghe nhạc mp3: superuser.com/questions/368623/iêu
eswald

Câu trả lời:


5

Không chắc là bạn sẽ có thể làm điều này trên ext4. Không giống như FAT (32), sử dụng bảng tệp tuyến tính trong một thư mục, các hệ thống tệp hiện đại sử dụng các cấu trúc phức tạp như cây B + (NTFS, XFS) hoặc cây B được băm (ext3 / 4), trong đó tất cả các mục được sắp xếp theo một thuật toán cụ thể.

Cụ thể, ext3 / 4 sắp xếp các tệp theo giá trị băm của tên của chúng, vì vậy bạn luôn nhận được các tệp giống nhau theo cùng một thứ tự. Có thể vô hiệu hóa tính năng dir_index thông qua tune2fs, nhưng nó có thể khiến bạn mất hiệu suất nếu bạn có các thư mục chứa nhiều tệp.


Một lệnh rất cơ bản cho điều này có thể là cp dir/* otherdir/, trong đó trình bao sắp xếp các tên khi mở rộng đối số và cpchỉ cần sao chép chúng theo thứ tự đã cho.

Một cái gì đó phức tạp hơn, để sao chép thư mục con:

#!/usr/bin/env bash
srcdir=$1
destdir=$2

find "$srcdir" \( -type d -printf "0dir %P\0" \) \
            -o \( -type f -printf "1file %P\0" \) |
sort -z | while read -r -d '' type path; do
    case $type in
        "0dir") mkdir -vp "$destdir/$path";;
        "1file") cp -v "$srcdir/$path" "$destdir/$path";;
    esac
done

Có thể ví dụ movecác tập tin để nói một new_tmpthư mục, và sau đó di chuyển chúng trở lại nhưng ra lệnh? (Có vẻ như hoạt động từ trong GUI cho các thư mục?!)
ajo

1
@ajo: Nếu hệ thống tập tin đã kích hoạt dir_index, nó sẽ không hoạt động. Bất kể bạn di chuyển / tạo tập tin theo thứ tự nào, chúng sẽ có cùng thứ tự sắp xếp miễn là chúng có cùng tên. Ví dụ, hãy thử mkdir test1 test2; touch test1/{a,b,c,d} test2/{d,c,b,a}; ls -f test1 test2- các tệp sẽ được sắp xếp theo cùng một thứ tự ( a c b .. d .trong hệ thống của tôi) mặc dù chúng được tạo ngược lại.
dùng1686

cp dir/* otherdir/vẻ dễ dàng hơn nhiều, nhưng sử dụng thứ tự ban đầu. Tôi có thể thực hiện sắp xếp ở đó?
ajo

2
@ajo: Shell được cho là sắp xếp tên tệp trước khi khởi chạy cp. Hãy thử echo dir/*xem những gì họ mở rộng đến. Nhưng một lần nữa, nó chỉ quan trọng khi sao chép vào thẻ nhớ FAT; nó sẽ không thay đổi bất cứ điều gì khi sao chép vào ext4.
dùng1686

1
Điều này có ổn cho thư mục không? find SRC_DIR -iname '*mp3' -print0 | sort -z | xargs -0 -I {} cp {} DEST_DIR
ajo

2

Hình như những người khác có vấn đề tương tự .

Công cụ cho phép người dùng sắp xếp các tệp theo mong muốn của họ và sắp xếp kiểu cấp thấp của hệ thống tệp FAT.

Cùng công cụ trên freecode.com

Hy vọng nó giúp.

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.