Dosyaları ve Dizinleri Yeniden Adlandırma (Önek Ekle)


137

Tüm klasörlere ve dizinlere önek eklemek istiyorum.

Misal:

Sahibim

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

"PRE_" ön ekini eklemek istiyorum

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

Saygılarımızla,


Kullanım AWK olduğu gibi bu cevap: awk '$ 0 = "öneki" 0 $' dosyası> new_file
Mark

Yanıtlar:


224

Sayesinde Heijden der Peter van , burada onları boşluk olan dosya adları için çalışacağız biri:

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

("-", adları aksi halde mv komutu için anahtar olarak yorumlanacak olan tire ile başlayan dosyalarda başarılı olmak için gereklidir)


Heh, doğru, içinde boşluk olan bir dosyanız varsa bu tamamen çalışmaz.
CanSpice

12
lsKomutu olarak değiştirir ve *bağımsız değişkenlerin içine çift tırnak işareti koyarsanız mv, boşluk içeren dosyalar için çalışır.
Peter van der Heijden

@CanSpice Benzer bir komut dosyasıyla bu işlemi tersine çevirmek (öneki kaldırmak) mümkün müdür?
Pascal Qyy

3
Teşekkürler dostum. Buradaki stajyer 67 dosyanın hepsini yeniden adlandırarak parmak kapaklarını kaybediyordu. Şerefe.
Felipe

1
"Mv -" sadece "mv" değil, aksi halde komut anahtarları olarak yorumlanacak olan tire ile başlayan dosyalara karşı korunmalıdır. Bunu düzeltmek için bir düzenlemeye katkıda bulunacağım.
Jacob C., Reinstate Monica'ya


61

İçin önek veya sonek ekleyerek dosyaları (dizinleri) için, size göre basit ve güçlü bir yol kullanabilirsiniz Xargs :

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

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

Xargs parametresini değiştiren seçeneği kullanıyor: -I. Ve man sayfasından daha ayrıntılı bilgi edinebilirsiniz.


2
Not: Sadece geçerli dizinin parça dosyalarını (dizinlerini) yeniden adlandırmak istiyorsanız , sadece ls *.old | xargs -I {} mv {} PRE_{}
xargs'dan

ilginç yeniden adlandırma kullanarak işe yaramadı. xargs kullanmak RHEL kurulumum için iyi gitti, bu yüzden +1 bu seçenek için, komutun anlaşılmasını kolaylaştırır
Acewin

Dosya adı tek tırnak içeriyorsa çalışmaz, başarısız olur: xargs: eşsiz tek tırnak; -0 seçeneğini kullanmazsanız, varsayılan olarak tırnak işaretleri
xargs'a özeldir

36

Bu basit bir findkomutla yapılabilir :

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

Yukarıdaki komut, geçerli dizindeki tüm dosya ve klasörlerin önüne ek ekler PRE_.


8

Util-linux'ları rename( prenameDebian ve bazı diğer sistemlerin perl varyantının aksine) kullanarak geçerli dizindeki tüm dosya ve klasörlere önek eklemek için şunları yapabilirsiniz:

rename '' <prefix> *

Bu, boş dizenin ilk oluşumunu (hemen bulunur) bulur ve ardından bu oluşumu önekinizle değiştirir, daha sonra dosya adının geri kalanını bunun sonuna yapıştırır. Bitti.

Son ekler için perl sürümünü kullanmanız veya find kullanmanız gerekir .


util-linuxDebian Stretch üzerinde bu gibi görünüyor /usr/bin/rename.ul.
user1338062

7

Ruby'niz varsa (1.9+)

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

7

Perl ile:

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

2

İşte kullanabileceğiniz basit bir komut dosyası. File::chdirYönetim cdişlemlerini işlemek için standart olmayan modülü kullanmayı seviyorum , bu nedenle bu komut dosyasını kullanmak için ( sudo cpan File::chdir) yüklemeniz gerekecek .

#!/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

Sistemimde, renamekomuta sahip değilim . İşte basit bir astar. Tüm HTML dosyalarını özyineli olarak bulur ve prefix_adlarının önüne ekler :

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done

1
ile find: Ayrıca komutları, bir döngü gerek yürütebileceği stackoverflow.com/a/33297439/2351568
DJCrashdummy

0

Bu, dosyalarınızı dizinlerine önek olarak ekleyecektir.

${f%/*}Geçen eğik çizgi kadar yolu /> dizin -

${f##*/}Geçen çizgiden önce bir şey olmadan metindir /yol olmadan> dosya adı -

İşte böyle:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.