如何对目录中的文件03.mp3 01.mp3 02.mp3(ls -f)进行物理重新排序?


11

当我将文件复制到USB记忆棒并在汽车mp3播放器中收听时,文件的物理顺序很重要。我的大多数音乐专辑文件夹都是未排序的,例如,ls -f可能产生:
03.song3.mp3
01.song1.mp3
02.song2.mp3

当我将该文件夹复制到USB记忆棒上时,文件将按顺序复制。我的车载mp3播放器以未排序的顺序显示文件,这不是我想要的。随后,我可以对USB记忆棒上的文件进行重新排序(请参阅:如何对文件夹进行重新排序?(如ls -U`中所示)),但是如果我可以在该目录中对它们进行重新排序,则可以完全避免硬盘驱动器上的文件(ext4)。 )?有办法吗?

(否则,可能存在一种写find命令的方法,该命令可以获取文件,对其进行排序,然后按顺序复制它们?)有任何建议吗?


或者,你可以对文件进行排序:他们复制到MP3播放器superuser.com/questions/368623/...
eswald

Answers:


5

您不太可能在ext4上执行此操作。与FAT(32)使用目录中的线性文件表不同,现代文件系统使用复杂的结构,例如B + tree(NTFS,XFS)或哈希B-tree(ext3 / 4),其中所有条目均根据一种特定的算法。

特别地,ext3 / 4根据文件名的哈希值对文件进行排序,因此您总是以相同的顺序获得相同的文件。可以通过禁用dir_index功能tune2fs,但是如果目录包含许多文件,则可能会降低性能。


一个非常基本的命令可能是cp dir/* otherdir/,其中shell在扩展参数时对名称进行排序,并cp按照给定的顺序简单地复制它们。

用于复制子目录的更复杂的事情:

#!/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

是否有可能例如move将文件说成new_tmp文件夹,然后将它们移回原来的顺序?(似乎可以在GUI的文件夹中工作吗?!)
2012年

1
@ajo:如果文件系统启用了dir_index,它将无法工作。无论您以何种顺序移动/创建文件,只要它们具有相同的名称,它们都将具有相同的排序顺序。例如,尝试mkdir test1 test2; touch test1/{a,b,c,d} test2/{d,c,b,a}; ls -f test1 test2-即使文件是a c b .. d .反向创建的,文件也将以相同的顺序排序(在我的系统中)。
user1686'1

cp dir/* otherdir/看起来轻松了许多,但使用原来的顺序。我可以在那里进行排序吗?
2012年

2
@ajo:shell应该在启动之前对文件名进行排序cp。尝试echo dir/*看看它们扩展到了什么。但同样,这仅在复制到FAT记忆棒时才重要。它会不会复制到ext4当改变任何东西。
user1686

1
单目录看起来好吗?find SRC_DIR -iname '*mp3' -print0 | sort -z | xargs -0 -I {} cp {} DEST_DIR
2012年

2

看起来别人也有类似的问题

该工具可让用户根据自己的意愿排列文件并对FAT文件系统的底层样式进行排序。

freecode.com上的相同工具

希望能帮助到你。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.