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,


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)


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


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.


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_.


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 .


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) }'

7

dengan Perl:

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

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: $!";
}

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.