当我将文件复制到我的 U 盘并在车载 mp3 播放器中收听时,文件的物理顺序很重要。我的大部分音乐专辑文件夹都是未分类的,例如ls -f
可能会产生:
03.song3.mp3
01.song1.mp3
02.song2.mp3
当我将该文件夹复制到我的 USB 记忆棒上时,文件将按该顺序复制。我的车载 mp3 播放器以未排序的顺序显示文件,这不是我想要的。我随后可以对 U 盘上的文件重新排序(请参阅:如何重新排序文件夹?(如 `ls -U` 中所示)),但如果我可以在我的硬盘驱动器上的该目录中重新排序它们,则可以完全避免这种情况(ext4 )?有没有办法做到这一点?
(否则,可能有一种编写find
命令的方法,即获取文件,对它们进行排序,然后按顺序复制它们??)有什么建议吗?
您不太可能在 ext4 上执行此操作。与使用目录中文件的线性表的 FAT(32) 不同,现代文件系统使用复杂的结构,例如 B+树(NTFS、XFS)或散列 B 树(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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4749 次 |
最近记录: |