Jak fizycznie zmienić kolejność plików `03.mp3 01.mp3 02.mp3` (` ls -f`) w katalogu?

11

Fizyczny porządek plików liczy kiedy skopiować je na moim pendrive i słuchać w odtwarzaczu mp3 samochodu. Większość folderów moich albumów muzycznych jest nieposortowanych , np. ls -fMoże produkować:
03.song3.mp3
01.song1.mp3
02.song2.mp3

Kiedy kopiuję ten folder na pamięć USB, pliki są kopiowane w tej kolejności. Mój samochodowy odtwarzacz mp3 wyświetla pliki w nieposortowanej kolejności, czego nie chcę. Mogę następnie zmienić kolejność plików na pamięci USB (patrz: Jak zmienić kolejność folderów? (Jak pokazano w `ls -U`) ), ale mogę całkowicie tego uniknąć, gdybym mógł zmienić ich kolejność w tym katalogu na dysku twardym (ext4 )? Czy jest na to sposób?

(W przeciwnym razie może istnieć sposób na napisanie findpolecenia, które pobiera pliki, sortuje je, a następnie kopiuje w kolejności?) Jakieś sugestie?

ajo
źródło
Ewentualnie możesz posortować pliki po skopiowaniu ich na odtwarzacz mp3: superuser.com/questions/368623/...
eswald

Odpowiedzi:

5

Jest mało prawdopodobne, że będziesz w stanie to zrobić na ext4. W przeciwieństwie do FAT (32), który korzystał z liniowej tabeli plików w katalogu, nowoczesne systemy plików wykorzystują złożone struktury, takie jak drzewo B + (NTFS, XFS) lub mieszane drzewo B (ext3 / 4), w którym wszystkie wpisy są sortowane według określony algorytm.

W szczególności ext3 / 4 sortuje pliki według wartości skrótu ich nazwy, więc zawsze otrzymujesz te same pliki w tej samej kolejności. Możliwe jest wyłączenie funkcji dir_index za pośrednictwem tune2fs, ale może to kosztować wydajność, jeśli masz katalogi zawierające wiele plików.


Bardzo podstawowym poleceniem tego może być cp dir/* otherdir/, gdy powłoka sortuje nazwy podczas rozwijania argumentów i cppo prostu kopiuje je w podanej kolejności.

Coś bardziej złożonego do kopiowania podkatalogów:

#!/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
użytkownik1686
źródło
Czy można np move. Pliki powiedzieć new_tmpfolder, a następnie przenieść je z powrotem, ale dyktować kolejność? (Wygląda na to, że działa z poziomu GUI dla folderów ?!)
ajo
1
@ajo: Jeśli system plików ma włączony katalog_indeks, nie będzie działać. Bez względu na to, w jakiej kolejności przenosisz / tworzysz pliki, będą miały ten sam porządek sortowania, o ile będą miały tę samą nazwę. Spróbuj na przykład mkdir test1 test2; touch test1/{a,b,c,d} test2/{d,c,b,a}; ls -f test1 test2- pliki zostaną posortowane w tej samej kolejności ( a c b .. d .w moim systemie), nawet jeśli zostały utworzone w odwrotnej kolejności.
user1686
cp dir/* otherdir/wygląda o wiele łatwiej, ale używa oryginalnej kolejności. czy mogę tam wdrożyć sortowanie?
ajo
2
@ajo: Powłoka ma posortować nazwy plików przed uruchomieniem cp. Spróbuj echo dir/*zobaczyć, do czego się rozwijają. Ale znowu, to ma znaczenie tylko podczas kopiowania na karty pamięci FAT; nic nie zmieni podczas kopiowania na ext4.
user1686
1
czy to wygląda OK dla pojedynczego katalogu? find SRC_DIR -iname '*mp3' -print0 | sort -z | xargs -0 -I {} cp {} DEST_DIR
ajo
2

Wygląda na to, że inni mają podobne problemy .

Narzędzie, które pozwala użytkownikom układać pliki zgodnie z ich życzeniami i sortuje styl niskiego poziomu systemu plików FAT.

To samo narzędzie na freecode.com

Mam nadzieję, że to pomoże.

benzoes
źródło