这物理顺序当我将文件复制到我的 USB 记忆棒上并在车载 mp3 播放器中收听时,这些文件很重要。我的大多数音乐专辑文件夹都是未分类例如ls -f
可能产生:
03.song3.mp3
01.song1.mp3
02.song2.mp3
当我将该文件夹复制到我的 USB 记忆棒上时,文件被复制到那顺序。我的车载 mp3 播放器以未排序的顺序显示文件,这不是我想要的。我随后可以重新排序 USB 记忆棒上的文件(参见:如何重新排序文件夹?(如`ls -U`中显示)),但如果可以的话,我就可以完全避免这种情况在该目录中重新排序将它们放在我的硬盘 (ext4) 上?有办法吗?
(如果做不到这一点,也许可以写一个find
命令,获取文件,对其进行排序,然后按顺序复制它们?有什么建议吗?
答案1
在 ext4 上你不太可能做到这一点。与使用目录中文件线性表的 FAT(32) 不同,现代文件系统使用复杂的结构,例如 B+tree(NTFS、XFS)或散列 B 树(ext3/4),其中所有条目都根据特定算法排序。
具体来说,ext3/4 根据文件名称的哈希值对文件进行排序,因此总是以相同的顺序获取相同的文件。可以禁用目录索引功能可以通过 来实现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