Aktualizuj nazwy plików w pojedynczym katalogu z prefiksem plus literą

1

Znalazłem wiele metod dodawania prostego prefiksu do plików w folderze w systemie Linux, np.

for FILENAME in *; do mv $FILENAME REF_$FILENAME; done 

( https://stackoverflow.com/questions/4787413/rename-files-and-directories-add-prefix )

Chciałbym to zrobić, ale z REF zmieniającym się dla każdego pliku REFa, REFb, REFc, ... Zostanie to uruchomione ręcznie w jednym katalogu, ponieważ REF będzie różny dla każdego z nich.

Z góry dziękuję, ponieważ zwycięzca dosłownie zaoszczędzi mi godzin ręcznego wprowadzania danych ;-)

Matthew
źródło
1
Czy możesz używać liczb zamiast liter? To znacznie ułatwiłoby rozwiązanie problemu. Czy używasz go również do zamawiania (w takim przypadku chcielibyśmy go umieścić)
davidgo

Odpowiedzi:

0

Szybka i brudna odpowiedź byłaby następująca:

array=(`echo {a..z}{a..z}{a..z}`);i=0; for FILENAME in *; do  mv $FILENAME REF${array[i]}_$FILENAME; i=$(($i+1)); done

Ale wolałbym to zrobić jako skrypt, który można następnie uruchomić - jest łatwiejszy do utrzymania i opisania

array=(`echo {a..z}{a..z}{a..z}`)
i=0 
for FILENAME in *
do 
    mv $FILENAME REF${array[i]}_$FILENAME 
    i=$(($i+1)) 
done

Pierwsza linia ładuje sekwencję 3-cyfrowych liter, rozpoczynając aaa i przechodząc do zzz. Możesz zmniejszyć lub zwiększyć rozmiar tej tablicy, zwiększając lub zmniejszając liczbę {a..z} - i możesz ją zastąpić wielkimi literami lub inną prostą sekwencją.

i jest licznikiem, który zwiększamy, abyśmy mogli uzyskać unikalną sekwencję dla każdej wartości REF.

Zaznaczam, że nie podoba mi się bit kodu „FILENAME in *”, ponieważ nie będzie on dobrze pasował do podkatalogów. Byłbym skłonny zastąpić tę linię

for FILENAME in `find . -type f`

do obsługi plików, w tym podkatalogów, lub

for FILENAME in `find . -maxdepth 1 -type f`

dla plików tylko w bieżącym katalogu (tj. nie rekurencyjne i ignorowanie katalogów)

davidgo
źródło
0

Możesz zbudować polecenie dostosowane do tego konkretnego problemu, jestem pewien, że inne odpowiedzi to zrobią. Moja odpowiedź brzmi: bardziej ogólne , może jednak ci pasuje.

vidir (najprawdopodobniej z moreutils pakiet) pozwala edytować nazwy plików w edytorze tekstu. Aby wybrać edytor, ustaw EDITOR zmienna.

W ten sposób możesz korzystać z wielu funkcji vi, emacs lub dowolnego edytora, którego używasz. Czytać man vidir aby dowiedzieć się, jak sprawić, by działał z podkatalogami, jeśli zajdzie taka potrzeba.

To jest przykład tego, jak wyglądałby w twoim edytorze:

1   ./AdbeRdr9.5.5-1_i486linux_enu.bin
2   ./AdobeAIRInstaller.bin
3   ./Dir1
4   ./Dir10
5   ./Dir2
6   ./bashfile.sh

Liczby identyfikują pliki w tym konkretnym wystąpieniu vidir, następują po nich karty. Nie możesz dotykać tych numerów i kart, chyba że wiesz, co robisz. Zmiany w nazwach plików są stosowane po zapisaniu tekstu.

Jeśli obawiasz się, że gdzieś znajduje się nazwa pliku z kartą lub znakiem nowego wiersza, a to coś złamie, zachowaj spokój. Z tego co wiem vidir w pierwszej kolejności odmówi współpracy.

Teraz najlepsza część. Edytor może również działać poza konsolą, więc możliwe jest:

  1. Odwołać się EDITOR=kate vidir, to się uruchomi kate redaktor.
  2. Skopiuj cały tekst i wklej do LibreOffice Calc; dostaniesz dwie kolumny.
  3. Manipuluj nazwami za pomocą narzędzi dostarczonych przez Calc, aby uzyskać dane wyjściowe w postaci dwóch kolumn: liczb i Nowy nazwy.
  4. Skopiuj te dwie kolumny z powrotem do kate i zastąp stary tekst.
  5. Zapisz plik tekstowy.

To jest bardzo potężne. Usunięcie linii i zapisanie pliku tekstowego spowoduje usunięcie plików. Zamiana liczb sprawi, że pliki zostaną zamienione nazwami (a nawet ścieżkami, jeśli pracujesz z podkatalogami). Z dużą mocą przychodzi duża odpowiedzialność. Najpierw powinieneś eksperymentować z plikami i katalogami, które można stracić.

Kamil Maciorowski
źródło