Benennen Sie die Dateien im Verzeichnis um

10

So benennen Sie Dateien in einem Verzeichnis wie der folgenden um: PMC21375.pdf.txtIch muss umbenannt werden in 21375.txt. dh ich muss beide PMCund pdfvon jedem Dateinamen entfernen .

kylejudita
quelle

Antworten:

9

Mit ‚s rename:

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

Demo:

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

von der shellEingabeaufforderung. Es ist sehr nützlich, Sie können einen Code wie ich in eine Substitution einfügen.

Sie können den -nSchalter (Trockenlaufmodus) entfernen, wenn Ihre Tests gültig werden.

Warnung Es gibt andere Tools mit demselben Namen, die dies möglicherweise können oder nicht. Seien Sie also vorsichtig.

Wenn Sie den folgenden Befehl ausführen ( linux)

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

und du hast ein Ergebnis wie

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

dann scheint dies das richtige Werkzeug zu sein =)

Wenn nicht, um es zum Standard (normalerweise bereits der Fall) zu machen Debianund abzuleiten wie Ubuntu:

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

(Ersetzen Sie /path/to/renameden Pfad Ihres perl's renameBefehls.


Last but not least wurde dieses Tool ursprünglich von Larry Wall, dem Vater des Perl, geschrieben.

Gilles Quenot
quelle
Dadurch wird das nicht .pdfaus dem Dateinamen entfernt.
William Everett
Beitrag entsprechend bearbeitet.
Gilles Quenot
5

Neben dem Umbenennungsbefehl können Sie dies direkt in bash tun (nur eine von vielen Möglichkeiten):

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

Bearbeitet, um Pinyaka zu zeigen, wie es funktioniert:

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
quelle
Dadurch wird das nicht .pdfaus dem Dateinamen entfernt.
William Everett
Hast du es versucht? denn für mich tut es. Wird in der Bearbeitung angezeigt.
Hmontoliu
Mein Fehler. Ich dachte, es würde nur Großbuchstaben konvertieren. Upvoted.
William Everett
4

Es gibt verschiedene Dienstprogramme zum Umbenennen von Dateien, aber eines der am einfachsten zu verwendenden ist rename. In Ihrem Fall können Sie wahrscheinlich Folgendes tun:

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

Der erste Parameter ist der Teil des Dateinamens, der ersetzt werden soll. Der zweite Parameter ist die Ersatzzeichenfolge. Hier verwende ich '', um die leere Zeichenfolge darzustellen. Alle folgenden Parameter sind Dateien, die umbenannt werden müssen. Hier habe ich *txtdas Ersetzen auf Textdateien beschränkt.

renamesollte bereits vorhanden sein, wenn Sie Linux ausführen. Wenn Sie ein * BSD oder OS X ausführen, müssen Sie es möglicherweise zuerst installieren.

wingedsubmariner
quelle
Ich glaube nicht, dass es eine GNU gibt rename. Es gibt eine von util-linuxund eine von perlmit unterschiedlicher Syntax. Dasjenige, auf das Sie sich beziehen, sieht aus wie das von util-linux, das manchmal aufgerufen wird rename.ul, um nicht mit dem renamevon verwechselt zu werden perl, während auf einigen anderen Systemen renamedas von util-linux und das von von perlaufgerufen wird prename.
Stéphane Chazelas
1
Meins ist das von util-linux. Ich dachte fälschlicherweise, es sei Teil von GNU Coreutils.
Wingedsubmariner
Die Standard-Debian-Version des Umbenennens wäre ungefähr so rename 's/PMC// *.txtundrename s/\.pdf// *.txt
William Everett
1

Erstellen Sie zuerst eine Sicherungskopie Ihrer Dateien! Dann können Sie im Grunde genommen einen Python-Einzeiler im aktuellen Verzeichnis mit der allgemeinen Form verwenden:

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

In Ihrem speziellen Fall können Sie dies zweimal verwenden:

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

zu entfernen .pdfund noch einmal:

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

zu entfernen PMC.

Xaratustra
quelle
0

Versuche dies:

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

Die j=${i//\.pdf/}Mittel zu ersetzen , .pdfin $inichts. Ebenso mit der zweiten j-Aufgabe, die PMC loszuwerden.

William Everett
quelle
0

Wenn Sie verwenden zsh, ist dies ein typischer Job für zmv:

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

( zmvBehandelt potenzielle Konflikte ordnungsgemäß).

Stéphane Chazelas
quelle