Powinieneś wyjaśnić, jak dokładnie zmienić nazwę tych plików.
Totor
1
Cóż, mam pliki z rozszerzeniem * .gappedPeak i chcę zmienić ich nazwę na * .bed. wszystkie znajdują się w tym samym katalogu, powinno to być bardzo proste, ale aby odnieść sukces, potrzebowałem pełnej pętli for
Sander Van der Zeeuw
Myślę, że to, co znalazłeś w Google, dotyczy MSDOS.
tiktak
Alternatywne rozwiązanie @devnull jest naprawdę pomocne
lucasvw,
Odpowiedzi:
22
Po wydaniu polecenia:
mv *.txt *.tsv
powłoka, załóżmy bash, rozwija symbole wieloznaczne, jeśli są jakieś pasujące pliki (w tym katalogi). Lista plików jest przekazywana do programu tutaj mv. Jeśli nie zostaną znalezione żadne dopasowania, wersja nierozwinięta jest przekazywana.
Znowu: powłoka rozszerza wzorce, a nie program.
Mnóstwo przykładów jest chyba najlepszym sposobem, więc zaczynamy:
Przykład 1:
$ ls
file1.txt file2.txt
$ mv *.txt *.tsv
Teraz w mvlinii dzieje się, że powłoka rozwija *.txtsię do pasujących plików. Ponieważ nie ma *.tsvplików, które nie zostaną zmienione.
mvPolecenie nazywa się z dwóch specjalnych argumentów :
argc: Liczba argumentów, w tym program.
argv: Tablica argumentów, w tym program jako pierwszy wpis.
mvKontrola programu, aby zobaczyć czy ostatni argument *.tsvjest katalogiem. Ponieważ tak nie jest, program nie może kontynuować pracy, ponieważ nie jest przeznaczony do łączenia plików. (Zazwyczaj przenieś wszystkie pliki do jednego.) Nie twórz katalogów według kaprysu.
Teraz ponownie mvsprawdź, czy *.tsvistnieje. W przeciwnym razie plik file1.txtzostanie przeniesiony do *.tsv. To znaczy: nazwa pliku zmienia się *.tsvna gwiazdkę i wszystko.
Ponieważ *.tsvteraz jest katalog, pliki są tam przenoszone.
Teraz: używając poleceń, takich jak some_command *.tsvkiedy rzeczywiście chcesz zachować symbol wieloznaczny, zawsze powinieneś go zacytować. Cytując, zapobiegasz rozszerzaniu symboli wieloznacznych, jeśli powinny być jakieś dopasowania. Powiedz np mkdir "*.tsv".
Przykład 4:
Rozszerzenie można wyświetlić jeszcze, jeśli wykonasz na przykład:
Teraz: mvpolecenie może i działa na wielu plikach. Ale jeśli jest ich więcej niż dwa, ostatni musi być katalogiem docelowym. (Opcjonalnie możesz użyć tej -t TARGET_DIRopcji, przynajmniej dla GNU mv.)
Co do twoich linków. Podałeś jeden (w komentarzu), w którym mvwcale nie wspomniano, ale rename. Jeśli masz więcej linków, które możesz udostępnić. Podobnie jak w przypadku stron podręcznika, w których twierdzisz, że jest to wyrażone.
Wiem, że to nie odpowiada na twoje pytanie, ale jeśli szukałeś innego sposobu zmiany nazwy plików w porównaniu do pętli obejścia, dlaczego nie użyć find? Używałem tego polecenia wiele razy, aby zastąpić rozszerzenia plików w dużych katalogach setkami tysięcy plików. Powinno to działać na każdym systemie zgodnym z POSIX:
' .' => ścieżka wyszukiwania zaczynająca się od bieżącego katalogu oznaczonego przez '. „
-name=> ustaw szukaną nazwę dopasowania (w tym przypadku wszystkie pliki, które kończą się
.gappedPeak)
-exec => wykonaj następujące polecenie przy każdym dopasowaniu
sh -c => 'exec' tworzy niezależne środowisko powłoki dla każdego dopasowania
mv "$1" "${1%.gappedPeak}.bed"=> mvpierwsza zmienna (oznaczona przez $ 1 ), która jest bieżącą nazwą pliku, do nowej nazwy. Tutaj wykonuję dopasowanie podciągu i usuwam; więc weź najpierw var, $ 1 i użyj, %aby usunąć .gappedPeakz ciągu. .bedNa końcu po prostu skleja pozostałą zmienną, która jest teraz po prostu , z , tworząc nową nazwę pliku.test#.bedtest#.bed
Podkreślenie jest symbolem zastępczym dla 0 USD
{}Otrzymuje każdego ( *.gappedPeak) pliku znalezionego przez findpolecenia i staje $ 1 do shkomendy.
\;oznacza koniec -execpolecenia. Możesz także użyć ';'lub ";".
Przykład:
[user@before]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Jan 26 11:40 test1.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test2.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test3.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test4.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test5.gappedPeak
[user@after]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Jan 26 11:40 test1.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test2.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test3.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test4.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test5.bed
Czy mógłbyś wykonać polecenie opisujące, co robi każda część?
user1717828,
Przepraszam za to, zaktualizowałem swój post. Mam nadzieję, że to pomaga.
devnull
1
Wielkie dzieki! Dzięki przewodnikowi bash i twojemu wyjaśnieniu udało mi się zdobyć wszystko.
user1717828,
Nie ma problemu. Cieszę się, że to pomaga.
devnull
Działa jak marzenie. Oto kolejny uproszczony przykład file.abc-> blub.xyzw wielu katalogach podrzędnych:find . -name "file.abc" -exec sh -c 'mv "$1" "$(dirname $1)/blub.xyz"' _ {} \;
Mahn
9
mv *.txt *.tsvnie działa; mvmoże zmienić nazwę tylko jednego pliku na raz. Albo źle zrozumiałeś wyjaśnienia, albo są w błędzie.
mmvi renamemoże zmieniać nazwy kilku plików jednocześnie. Ale istnieją dwie wersje, renamektóre są nazywane inaczej. Tutaj powinno być wiele pytań.
@SanderVanderZeeuw Żenujące. Te osoby oferują kursy? Niestety nie widzę tam możliwości kontaktu. Możesz łatwo sprawdzić, czy to działa. Ale w mv *.txt *.tsvmvnie (zwykle) nie widzi *.txtlub wyświetla *.tsvnazwy plików z rozszerzeniem powłoki. Liczba plików rozwijanych przez te symbole wieloznaczne byłaby „losowa”. Jedyną sytuacją, w której to działa, jest plik o nazwie, *.txtktórego nazwa zostanie zmieniona na (dosłownie) *.tsv(bez cytowania bashopcji nullglobnie można ustawić).
Hauke Laging
1
Albo gorzej. Jeśli ktoś ma jeden plik o nazwie np foo.txti jedną o nazwie będzie zastąpić istniejący plik ...baz.tsvmv *.txt *.tsv.tsv
Runium
4
Na przykład, jeśli masz asd.txti qwe.txtpliki w katalogu po uruchomieniu polecenia mv *.txt *.tsv, próbuje przenieść te dwa pliki do katalogu o nazwie *.tsv. Ponieważ nie ma takiego katalogu, pojawia się błąd.
Odpowiedzi:
Po wydaniu polecenia:
powłoka, załóżmy bash, rozwija symbole wieloznaczne, jeśli są jakieś pasujące pliki (w tym katalogi). Lista plików jest przekazywana do programu tutaj
mv
. Jeśli nie zostaną znalezione żadne dopasowania, wersja nierozwinięta jest przekazywana.Znowu: powłoka rozszerza wzorce, a nie program.
Mnóstwo przykładów jest chyba najlepszym sposobem, więc zaczynamy:
Przykład 1:
Teraz w
mv
linii dzieje się, że powłoka rozwija*.txt
się do pasujących plików. Ponieważ nie ma*.tsv
plików, które nie zostaną zmienione.mv
Polecenie nazywa się z dwóch specjalnych argumentów :argc
: Liczba argumentów, w tym program.argv
: Tablica argumentów, w tym program jako pierwszy wpis.W powyższym przykładzie byłoby to:
mv
Kontrola programu, aby zobaczyć czy ostatni argument*.tsv
jest katalogiem. Ponieważ tak nie jest, program nie może kontynuować pracy, ponieważ nie jest przeznaczony do łączenia plików. (Zazwyczaj przenieś wszystkie pliki do jednego.) Nie twórz katalogów według kaprysu.W rezultacie przerywa działanie i zgłasza błąd:
Przykład 2:
Teraz, jeśli zamiast tego powiesz:
mv
Polecenie jest wykonywane z:Teraz ponownie
mv
sprawdź, czy*.tsv
istnieje. W przeciwnym razie plikfile1.txt
zostanie przeniesiony do*.tsv
. To znaczy: nazwa pliku zmienia się*.tsv
na gwiazdkę i wszystko.Przykład 3:
Jeśli zamiast tego powiedziałeś:
mv
Polecenie jest wykonywane z:Ponieważ
*.tsv
teraz jest katalog, pliki są tam przenoszone.Teraz: używając poleceń, takich jak
some_command *.tsv
kiedy rzeczywiście chcesz zachować symbol wieloznaczny, zawsze powinieneś go zacytować. Cytując, zapobiegasz rozszerzaniu symboli wieloznacznych, jeśli powinny być jakieś dopasowania. Powiedz npmkdir "*.tsv"
.Przykład 4:
Rozszerzenie można wyświetlić jeszcze, jeśli wykonasz na przykład:
Przykład 5:
Teraz:
mv
polecenie może i działa na wielu plikach. Ale jeśli jest ich więcej niż dwa, ostatni musi być katalogiem docelowym. (Opcjonalnie możesz użyć tej-t TARGET_DIR
opcji, przynajmniej dla GNU mv.)Więc to jest OK:
Tutaj
mv
będzie się nazywać z:i wszystkie pliki trafiają do katalogu
foo
.Co do twoich linków. Podałeś jeden (w komentarzu), w którym
mv
wcale nie wspomniano, alerename
. Jeśli masz więcej linków, które możesz udostępnić. Podobnie jak w przypadku stron podręcznika, w których twierdzisz, że jest to wyrażone.źródło
Wiem, że to nie odpowiada na twoje pytanie, ale jeśli szukałeś innego sposobu zmiany nazwy plików w porównaniu do pętli obejścia, dlaczego nie użyć
find
? Używałem tego polecenia wiele razy, aby zastąpić rozszerzenia plików w dużych katalogach setkami tysięcy plików. Powinno to działać na każdym systemie zgodnym z POSIX:Podział poleceń:
Przykład:
źródło
file.abc
->blub.xyz
w wielu katalogach podrzędnych:find . -name "file.abc" -exec sh -c 'mv "$1" "$(dirname $1)/blub.xyz"' _ {} \;
mv *.txt *.tsv
nie działa;mv
może zmienić nazwę tylko jednego pliku na raz. Albo źle zrozumiałeś wyjaśnienia, albo są w błędzie.mmv
irename
może zmieniać nazwy kilku plików jednocześnie. Ale istnieją dwie wersje,rename
które są nazywane inaczej. Tutaj powinno być wiele pytań.źródło
rename
, a niemv
.mv *.txt *.tsv
mv
nie (zwykle) nie widzi*.txt
lub wyświetla*.tsv
nazwy plików z rozszerzeniem powłoki. Liczba plików rozwijanych przez te symbole wieloznaczne byłaby „losowa”. Jedyną sytuacją, w której to działa, jest plik o nazwie,*.txt
którego nazwa zostanie zmieniona na (dosłownie)*.tsv
(bez cytowaniabash
opcjinullglob
nie można ustawić).foo.txt
i jedną o nazwie będzie zastąpić istniejący plik ...baz.tsv
mv *.txt *.tsv
.tsv
Na przykład, jeśli masz
asd.txt
iqwe.txt
pliki w katalogu po uruchomieniu poleceniamv *.txt *.tsv
, próbuje przenieść te dwa pliki do katalogu o nazwie*.tsv
. Ponieważ nie ma takiego katalogu, pojawia się błąd.źródło
rename(1)
rename
jest skryptem perla autorstwa Larry'ego Walla, twórcy perla. Wymaga wyrażenia regularnego Perla i działa na nazwie pliku.Instalacja
Debian / Ubuntu
Jeśli musisz zainstalować
rename
na Debian / Ubuntu, możesz to zrobićźródło
Inną opcją do rozważenia jest użycie:
*.txt
pliki*.tsv
, zachowując ich atrybuty za pomocą-p
flagi.*.txt
mv
która po prostu zmienia katalog / nazwę pliku bez przenoszenia plików, chyba że znajdują się na innej partycji.źródło