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

ajo*_*ajo 12 linux ls find

当我将文件复制到我的 U 盘并在车载 mp3 播放器中收听时,文件的物理顺序很重要。我的大部分音乐专辑文件夹都是未分类的,例如ls -f可能会产生:
03.song3.mp3
01.song1.mp3
02.song2.mp3

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

(否则,可能有一种编写find命令的方法,即获取文件,对它们进行排序,然后按顺序复制它们??)有什么建议吗?

use*_*686 5

您不太可能在 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)

  • @ajo:*shell* 应该在启动 `cp` 之前对文件名进行排序。试试 `echo dir/*` 看看它们扩展到什么。但同样,只有在复制到 FAT 记忆棒时才重要;复制到 ext4 时它不会* 改变任何内容。 (2认同)