Ubah Nama File dan Direktori (Tambah Awalan)

142

Saya ingin menambahkan awalan pada semua folder dan direktori.

Contoh:

saya sudah

Hi.jpg
1.txt
folder/
this.file_is.here.png
another_folder.ok/

Saya ingin menambahkan awalan "PRE_"

PRE_Hi.jpg
PRE_1.txt
PRE_folder/
PRE_this.file_is.here.png
PRE_another_folder.ok/

Salam,

Rafael
sumber
Gunakan AWK sebagai jawaban ini : awk '$ 0 = "prefix" $ 0' file> new_file
Tandai

Jawaban:

228

Terima kasih kepada Peter van der Heijden , berikut ini salah satu yang akan berfungsi untuk nama file dengan spasi di dalamnya:

for f in * ; do mv -- "$f" "PRE_$f" ; done

("-" diperlukan agar berhasil dengan file yang dimulai dengan tanda hubung, yang namanya akan diartikan sebagai sakelar untuk perintah mv)

CanSpice
sumber
Heh, benar, ini sama sekali tidak akan berfungsi jika Anda memiliki file dengan spasi di dalamnya.
CanSpice
12
Jika Anda mengubah lsperintah menjadi *dan memberi tanda kutip ganda di sekitar argumen menjadi mv, ini akan berfungsi untuk file yang berisi spasi.
Peter van der Heijden
@CanSpice Apakah mungkin untuk membalikkan operasi ini (menghapus awalan) dengan skrip yang serupa?
Pascal Qyy
3
Terima kasih, sobat. Magang di sini kehilangan tutup jarinya yang mengganti nama semua 67 file. Bersulang.
Felipe
1
Seharusnya "mv -" bukan hanya "mv", untuk melindungi file yang dimulai dengan tanda hubung, yang akan diartikan sebagai sakelar perintah. Saya akan berkontribusi mengedit untuk memperbaiki ini.
Jacob C. mengatakan Reinstate Monica
83

Gunakan dengan rename skrip cara ini:

$ rename 's/^/PRE_/' *

Tidak ada masalah dengan karakter meta atau spasi dalam nama file.

tchrist
sumber
3
Beberapa sistem memiliki utilitas util-linux yang disebut "rename" yang bekerja secara berbeda (di Ubuntu disebut "rename.ul").
Dijeda sampai pemberitahuan lebih lanjut.
renameselalu membantu saya menangani beberapa penggantian nama file dengan sangat mudah.
Alan Haggai Alavi
61

Untuk menambahkan prefiks atau sufiks untuk file (direktori), Anda dapat menggunakan cara yang sederhana dan hebat dengan xargs :

ls | xargs -I {} mv {} PRE_{}

ls | xargs -I {} mv {} {}_SUF

Ini menggunakan opsi penggantian parameter dari xargs: -I. Dan Anda bisa mendapatkan lebih banyak detail dari halaman manual.

Zheng Qsin
sumber
2
PS: Jika Anda hanya ingin mengganti nama file bagian (direktori) dari direktori saat ini, cukup filter sebelum xargs, seperti:ls *.old | xargs -I {} mv {} PRE_{}
Zheng Qsin
menariknya menggunakan rename tidak berhasil. menggunakan xargs berjalan dengan baik untuk pengaturan RHEL saya jadi +1 untuk opsi ini, membuatnya mudah untuk memahami perintah
Acewin
Tidak berfungsi jika nama file berisi kutipan tunggal, gagal dengan: xargs: kutipan tunggal yang tidak cocok; secara default kutipan khusus untuk xargs kecuali Anda menggunakan opsi -0
Evgeny Veretennikov
38

Ini dapat dilakukan dengan menjalankan findperintah sederhana :

find * -maxdepth 0 -exec mv {} PRE_{} \;

Perintah di atas akan mengawali semua file dan folder di direktori saat ini dengan PRE_.

Kode siklon
sumber
8

Untuk menambahkan awalan ke semua file dan folder di direktori saat ini menggunakan util-linux rename(sebagai lawan dari prename, varian perl dari Debian dan sistem tertentu lainnya), Anda dapat melakukan:

rename '' <prefix> *

Ini menemukan kemunculan pertama dari string kosong (yang ditemukan segera) dan kemudian menggantikan kejadian itu dengan awalan Anda, kemudian menempelkan sisa nama file ke akhir itu. Selesai.

Untuk sufiks , Anda perlu menggunakan versi perl atau gunakan find .

koyae
sumber
util-linuxdi Debian Stretch tampaknya menyediakan ini sebagai /usr/bin/rename.ul.
pengguna1338062
7

Jika Anda memiliki Ruby (1.9+)

ruby -e 'Dir["*"].each{|x| File.rename(x,"PRE_"+x) }'
kurumi
sumber
7

dengan Perl:

perl -e 'rename $_, "PRE_$_" for <*>'
tadmc
sumber
2

Berikut ini skrip sederhana yang dapat Anda gunakan. Saya suka menggunakan modul non-standar File::chdiruntuk menangani cdoperasi pengelolaan , jadi untuk menggunakan skrip ini apa adanya Anda perlu menginstalnya ( sudo cpan File::chdir).

#!/usr/bin/perl

use strict;
use warnings;

use File::Copy;
use File::chdir; # allows cd-ing by use of $CWD, much easier but needs CPAN module

die "Usage: $0 dir prefix" unless (@ARGV >= 2);
my ($dir, $pre) = @ARGV;

opendir(my $dir_handle, $dir) or die "Cannot open directory $dir";
my @files = readdir($dir_handle);
close($dir_handle);

$CWD = $dir; # cd to the directory, needs File::chdir

foreach my $file (@files) {
  next if ($file =~ /^\.+$/); # avoid folders . and ..
  next if ($0 =~ /$file/); # avoid moving this script if it is in the directory

  move($file, $pre . $file) or warn "Cannot rename file $file: $!";
}
Joel Berger
sumber
1

Di sistem saya, saya tidak memiliki renameperintah. Ini adalah satu baris sederhana. Ia menemukan semua file HTML secara rekursif dan menambahkan prefix_di depan namanya:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done
conradkleinespel.dll
sumber
1
dengan findAnda juga dapat menjalankan perintah, tidak perlu loop: stackoverflow.com/a/33297439/2351568
DJCrashdummy
0

Ini akan memberi awalan file Anda di direktorinya.

Ini ${f%/*}adalah jalur hingga garis miring terakhir /-> direktori

Ini ${f##*/}adalah teks tanpa apa pun sebelum garis miring terakhir /-> nama file tanpa jalur

Jadi begitulah kelanjutannya:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
SteinAir
sumber