Zmień nazwę plików w katalogu

10

Jak zmienić nazwę plików w katalogu, takim jak następujący plik PMC21375.pdf.txt:, muszę zmienić nazwę na 21375.txt. tzn. muszę usunąć jedno PMCi drugie pdfz każdej nazwy pliku.

kylejudita
źródło

Odpowiedzi:

9

Z „s rename:

rename 's/(PMC|\.pdf)//g' *pdf.txt 

Próbny :

$ ls *txt
PMC21375.pdf.txt
$ rename -n 's/(PMC|\.pdf)//g' *txt 
PMC21375.pdf.txt -> 21375.txt

z shellmonitu. Jest to bardzo przydatne, możesz wstawić trochę kodu tak jak ja, w podstawieniu.

Możesz usunąć -n(przełącznik trybu pracy na sucho), gdy testy staną się ważne.

ostrzeżenie Istnieją inne narzędzia o tej samej nazwie, które mogą lub nie mogą tego zrobić, więc bądź ostrożny.

Jeśli uruchomisz następujące polecenie ( linux)

$ file $(readlink -f $(type -p rename))

i masz wynik jak

.../rename: Perl script, ASCII text executable

to wydaje się być właściwym narzędziem =)

Jeśli nie, aby ustawić ją jako domyślną (zwykle już tak jest) Debiani pochodną taką jak Ubuntu:

$ sudo update-alternatives --set rename /path/to/rename

(zamień /path/to/renamena ścieżkę twojego perl's renamepolecenia.


Last but not least, to narzędzie zostało pierwotnie napisane przez Larry'ego Walla, ojca Perla.

Gilles Quenot
źródło
Nie spowoduje to usunięcia .pdfnazwy pliku.
William Everett,
Post został odpowiednio zmodyfikowany.
Gilles Quenot
5

Oprócz polecenia zmiany nazwy możesz to zrobić bezpośrednio w bash (tylko jeden sposób z wielu):

 for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done

Edytowane, aby pokazać Pinyaka, jak to działa:

hmontoliu@ulises2:/tmp/foo$ touch PCM21375.pdf.txt PCM21376.pdf.txt
hmontoliu@ulises2:/tmp/foo$ ls
   PCM21375.pdf.txt  PCM21376.pdf.txt
hmontoliu@ulises2:/tmp/foo$ for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done
hmontoliu@ulises2:/tmp/foo$ ls
   21375.txt  21376.txt
hmontoliu
źródło
To nie usunie .pdfz nazwy pliku.
William Everett,
próbowałeś tego? ponieważ dla mnie tak jest. Pokazane w edycji.
hmontoliu
Mój błąd. Myślałem, że po prostu zamieni wielkie litery. Pozytywne.
William Everett,
4

Istnieje kilka narzędzi do zmiany nazw plików, ale jednym z najłatwiejszych w użyciu jest rename. W twoim przypadku prawdopodobnie możesz zrobić:

rename PMC '' *txt
rename .pdf '' *txt

Pierwszy parametr to część nazwy pliku do zastąpienia. Drugi parametr to ciąg zastępujący. Tutaj używam ''do reprezentowania pustego ciągu. Wszystkie poniższe parametry to pliki do zmiany nazwy, tutaj *txtograniczyłem zastępowanie do plików tekstowych.

renamepowinien już być obecny, jeśli używasz Linuksa. Jeśli używasz * BSD lub OS X, być może będziesz musiał go najpierw zainstalować.

wingedsubmariner
źródło
Nie sądzę, że jest GNU rename. Jest jeden z util-linuxi jeden perlz inną składnią. Ten, do którego się odnosisz, wygląda tak, jak ten z util-linuxtego, który jest czasami wywoływany, rename.ulaby nie mylić go renamez perl, podczas gdy w niektórych innych systemach, renameto ten z util-linux i ten z perljest nazywany prename.
Stéphane Chazelas
1
Mój jest tym z util-linux. Pomyślałem, że to część jądra GNU.
wingedsubmariner
Domyślna wersja zmiany nazwy Debiana byłaby rename 's/PMC// *.txtrename s/\.pdf// *.txt
William Everett
1

Najpierw wykonaj kopię zapasową plików! Zasadniczo możesz użyć jedno-liniowego python w bieżącym katalogu w ogólnej formie:

python -c "import glob,os; [os.rename(fn, fn.replace('PATTERN', 'REPLACE')) for fn in glob.glob('PATH/*')]"

w twoim konkretnym przypadku możesz użyć tego dwukrotnie:

python -c "import glob,os; [os.rename(fn, fn.replace('.pdf', '')) for fn in glob.glob('*')]"

usunąć .pdfi ponownie:

python -c "import glob,os; [os.rename(fn, fn.replace('PMC', '')) for fn in glob.glob('*')]"

do usunięcia PMC.

xaratustra
źródło
0

Spróbuj tego:

for i in *.pdf.txt; do j=${i//\.pdf/}; j=${j//PMC/}; mv $i $j; done

Te j=${i//\.pdf/}środki, aby zastąpić .pdfw $inic. Podobnie z drugim zadaniem j pozbywającym się PMC.

William Everett
źródło
0

Jeśli używasz zsh, jest to typowa praca dla zmv:

zmv 'PMC(*).pdf.txt' '$1.txt'

(z zmvwdziękiem radzi sobie z potencjalnymi konfliktami).

Stéphane Chazelas
źródło