如何按特定顺序写入文件?

Ber*_*nie 5 rsync

好的,这是一个奇怪的问题——我妻子刚买了一辆 2014 年的 Nissan Altima。所以,我拿了她的 iTunes 库并将 .m4a 文件转换为 .mp3,因为汽车音响系统只支持 .mp3 和 .wma。到现在为止还挺好。然后我将文件复制到 DOS FAT-32 格式的 USB 拇指驱动器,并将驱动器连接到汽车的 USB 端口,却发现所有曲目都乱序了。所有曲目都以两位数字前缀开头,即 01、02、03 等。因此您会认为它们是有序的。所以我打电话给 Nissan Connect 支持,该代表告诉我,以正确的顺序读取文件存在一个已知问题。他说这些文件的读取顺序与写入的顺序相同。所以,我按照预定的顺序手动复制了几张专辑,果然他是对的。

所以我复制了大约6张专辑进行测试,然后切换到顶级目录并进行了“查找.>music.txt”。然后我把这个文件传递给 rsync 像这样:

rsync -av --files-from=music.txt . ../Marys\ Music\ Sequenced/
Run Code Online (Sandbox Code Playgroud)

这些文件看起来是按顺序复制的,但是当我按照修改时间的顺序列出文件时,它们与原始文件的顺序相同:

../Marys Music Sequenced/Air Supply/Air Supply Greatest Hits> ls -1rt
01 Lost In Love.mp3
04 Every Woman In The World.mp3
03 Chances.mp3
02 All Out Of Love.mp3
06 Here I Am (Just When I Thought I Was Over You).mp3
05 The One That You Love.mp3
08 I Want To Give It All.mp3
07 Sweet Dreams.mp3
11 Young Love.mp3
Run Code Online (Sandbox Code Playgroud)

那么问题来了,如何复制一个名为music.txt 的文件中列出的文件,并将它们复制到一个目的地,并确保修改时间与列出的文件顺序相同?

mpy*_*mpy 5

你问了两个问题,一个明确说明,一个只是含蓄:

  1. 如何复制名为music.txt的文件中列出的文件,并将它们复制到目的地,并确保修改时间与列出的文件顺序相同?

  2. 我怎样才能让我的 MP3 播放器按字母顺序从 U 盘(用 FAT 文件系统格式化)读取文件?

但恕我直言,第二个是你真正的。我认为,日产的家伙让你走错了路。(见XY问题

但是废话太多了……现在我试着回答这两个问题:

  1. 您的rsync方法几乎是第一个问题的解决方案,只有您使用了-a参数。Rsync 的-a等价于-rlptgoD,其中特别包括-t

    人 rsync (...)

    这告诉 rsync 将修改时间与文件一起传输并在远程系统上更新它们。

    绝对不是你想要的。当您复制到 FAT 文件系统(它既不支持所有者、组、权限、链接等)时,我也看不出使用 FAT 提供的大多数其他选项的充分理由-a,因此请尝试

    rsync -rv --files-from=music.txt . ../Marys\ Music\ Sequenced/
    
    Run Code Online (Sandbox Code Playgroud)
  2. 要按字母顺序读取 MP3 文件,我建议使用另一种方法。我怀疑这些文件的读取顺序与 Nissan 技术人员所述的写入顺序相同,而是按照它们在文件分配表中列出的顺序。正是为了重新排列该顺序,有一个简洁的工具,称为fatsort

    首先,确保您的 U 盘没有安装并找到相应的设备(例如使用cat /proc/partitions),假设它是/dev/sdi1。然后运行fatsort:

    fatsort -cn /dev/sdi1
    
    Run Code Online (Sandbox Code Playgroud)

    这对文件条目进行排序,不区分大小写,并以所谓的自然顺序(包括字母顺序)排序。1)

    它非常快,如果您只添加一个其他文件,则无需一遍又一遍地复制所有文件。


1)我现在无法测试命令,但如果我没记错的话,-n就是你想要的。如果没有,请自行咨询帮助 ( fatsort -h)。


Che*_*art 0

可以用 xargs 完成:

cat music.txt | xargs -I% rsync -av "./%" "../Marys\ Music\ Sequenced/%"
Run Code Online (Sandbox Code Playgroud)

另一种方法是这样做(假设一切都是顺序的):

ls "../Marys\ Music\ Sequenced/" | xargs -I% touch "%"
Run Code Online (Sandbox Code Playgroud)