Uzantılarını değiştirmek için dosyaları yeniden adlandırmak istiyorum
mv *.txt *.tsv
Ama bunu yaparken şunu alıyorum:
* .tsv bir dizin değil
İlk 10 google hitinin gösterisinin mv
bu şekilde çalışması gerektiğini garip buluyorum .
Uzantılarını değiştirmek için dosyaları yeniden adlandırmak istiyorum
mv *.txt *.tsv
Ama bunu yaparken şunu alıyorum:
* .tsv bir dizin değil
İlk 10 google hitinin gösterisinin mv
bu şekilde çalışması gerektiğini garip buluyorum .
Yanıtlar:
Komutu verdiğinizde:
mv *.txt *.tsv
Kabuk, bash varsayalım sağlar genişletir joker eğer (dizinleri dahil) herhangi bir eşleme dosyaları vardır. Dosya listesi burada programa iletilir mv
. Eşleşme bulunamazsa, genişletilmiş sürüm iletilir.
Yine: kabuk , programı değil, desenleri genişletir.
Örneklerin çoğu belki de en iyi yoldur, işte başlıyoruz:
$ ls
file1.txt file2.txt
$ mv *.txt *.tsv
Şimdi mv
satırda olan şey , kabuğun*.txt
eşleşen dosyalara genişlemesidir . Değişmeyen *.tsv
dosya olmadığı için.
mv
Komut denir iki özel argümanlarla :
argc
: Program dahil argüman sayısı.argv
: Programı ilk giriş olarak içeren bir argüman dizisi.Yukarıdaki örnekte şöyle olur:
argc = 4
argv[0] = mv
argv[1] = file1.txt
argv[2] = file2.txt
argv[3] = *.tsv
mv
Son argüman, eğer programı onay görmek için *.tsv
, bir dizindir. Olmadığından, program dosyaları birleştirmek için tasarlanmadığından devam edemez. (Genellikle tüm dosyaları tek bir dosyaya taşır.) Bir hevesle dizinler oluşturmaz.
Sonuç olarak hatayı durdurur ve hatayı rapor eder:
mv: target ‘*.tsv’ is not a directory
Şimdi bunun yerine söylerseniz:
$ mv *1.txt *.tsv
mv
Komut ile yürütülür:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
Şimdi, tekrar mv
olup *.tsv
olmadığını kontrol edin . Değil gibi dosyaya file1.txt
taşınır *.tsv
. Yani: dosya, *.tsv
yıldız işareti ve tümü ile yeniden adlandırıldı .
$ mv *1.txt *.tsv
‘file1.txt’ -> ‘*.tsv’
$ ls
file2.txt *.tsv
Onun yerine şöyle dedi:
$ mkdir *.tsv
$ mv *.txt *.tsv
mv
Komut ile yürütülür:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Gibi *.tsv
artık bir dizindir, varlık kadar dosyalar uçları orada taşındı.
Şimdi: some_command *.tsv
niyetin joker karakterini saklamak olduğu gibi komutları kullanmak , daima bir alıntı yapmalı. Alıntı yaparak, herhangi bir eşleşme olması durumunda joker karakterlerin genişlemesini önlersiniz. Örneğin, söyle mkdir "*.tsv"
.
Örneğin, genişleme daha da görülebilir:
$ ls
file1.txt file2.txt
$ mkdir *.txt
mkdir: cannot create directory ‘file1.txt’: File exists
mkdir: cannot create directory ‘file2.txt’: File exists
Şimdi: mv
komut birden fazla dosya üzerinde çalışabilir ve yapabilir. Ancak ikiden fazla varsa sonuncusu bir hedef dizin olmalıdır. (İsteğe bağlı olarak, -t TARGET_DIR
seçeneği, en azından GNU mv için kullanabilirsiniz.)
Yani bu tamam:
$ ls -F
b1.tsv b2.tsv f1.txt f2.txt f3.txt foo/
$ mv *.txt *.tsv foo
İşte mv
ile çağrılır:
argc = 7
argv[0] = mv
argv[1] = b1.tsv
argv[2] = b2.tsv
argv[3] = f1.txt
argv[4] = f2.txt
argv[5] = f3.txt
argv[6] = foo
ve tüm dosyalar dizinde son bulur foo
.
Linkleriniz gelince Bir yorum (bir yorumda) verdiniz, burada mv
hiç bahsedilmedi, ama rename
. Daha fazla bağlantınız varsa paylaşabilirsiniz. Bunun yanı sıra, iddia ettiğiniz man sayfaları için de ifade edilir.
Bunun sorunuzu yanıtlamadığını biliyorum, ancak dosyaları çalışma döngüsüne göre yeniden adlandırmanın başka bir yolunu arıyorsanız, neden kullanmıyorsunuz find
? Bu komutu, büyük dizinlerdeki dosya uzantılarını yüz binlerce dosyayla değiştirmek için defalarca kullandım. Bu, POSIX uyumlu herhangi bir sistemde çalışmalıdır:
find . -name "*.gappedPeak" -exec sh -c 'mv "$1" "${1%.gappedPeak}.bed"' _ {} \;
Komuta Dağılımı:
'
.
' => 'ile işaretlenmiş geçerli dizinden başlayan arama yolu. '
-name
=> set set eşleşen adı bul (bu durumda biten tüm dosyalar.gappedPeak
)
-exec
=> her maçta aşağıdaki komutu yürütün
sh -c
=> 'exec' her eşleşme için bağımsız bir kabuk ortamı yaratır
mv "$1" "${1%.gappedPeak}.bed"
=> geçerli dosya adı olanmv
ilk değişken ( $ 1 ile gösterilir ) yeni isme. Burada bir alt dize eşleşmesi yapıyorum ve siliyorum; bu yüzden ilk önce tekrar var var, $ 1 ve dizeden%
silmek için kullanın.gappedPeak
..bed
Sonunda az önce, kalan bir değişken, birleştirir ile, yeni oluşturmatest#
.bed
test#.bed
dosya adını.Alt çizgi 0 $ için bir yer tutucudur
{}
Her (yerine*.gappedPeak
göre bulunan) dosyafind
komutu ve olur 1 $ içinsh
komuta.
\;
-exec
komutun sonunu işaretler . Ayrıca';'
veya kullanabilirsiniz";"
.
Örnek:
[user@before]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Jan 26 11:40 test1.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test2.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test3.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test4.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test5.gappedPeak
[user@after]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Jan 26 11:40 test1.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test2.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test3.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test4.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test5.bed
file.abc
-> için basitleştirilmiş bir örnek blub.xyz
:find . -name "file.abc" -exec sh -c 'mv "$1" "$(dirname $1)/blub.xyz"' _ {} \;
mv *.txt *.tsv
çalışmıyor; mv
bir seferde yalnızca bir dosyayı yeniden adlandırabilir. Açıklamaları yanlış anladınız veya yanlış.
mmv
ve rename
aynı anda birkaç dosyayı yeniden adlandırabilir. Ancak rename
farklı olarak adlandırılan etrafında iki versiyonu var . Bununla ilgili bir sürü soru olmalı.
rename
, kullanmaz mv
.
mv *.txt *.tsv
mv
içeride (genellikle) kabuk genişletilmiş dosya adlarını görmez *.txt
veya görür *.tsv
. Bu joker karakterlerin genişlettiği dosya sayısı "rasgele" olur. Bunun çalıştığı tek durum, isminin *.txt
değişmesi gereken bir dosya varsa (kelimenin tam anlamıyla) *.tsv
( bash
seçenek belirtilmeden nullglob
ayarlanmamalıdır).
foo.txt
ve bir adlandırılmış varolan üzerine yazar dosyayı ...baz.tsv
mv *.txt *.tsv
.tsv
Örneğin , komutu çalıştırdığınızda dizinde bulunan dosyalar varsa asd.txt
ve bu iki dosyayı adlandırılmış bir dizine taşımaya çalışır . Böyle bir dizin olmadığı için hata veriyor.qwe.txt
mv *.txt *.tsv
*.tsv
rename(1)
rename
perl yapımcısı Larry Wall tarafından yazılmış bir perl yazısı. Bir Perl regex alır ve dosya adı üzerinde çalışır.
rename 's/\.txt$/.tsv/' *.txt
Yüklemek gerekirse rename
Debian / Ubuntu üzerinde yapabileceğiniz
sudo apt install rename
Dikkate alınması gereken başka bir seçenek de kullanıyor:
cp -p *.txt *.tsv
rm -f *.txt
*.txt
dosyaları kopyalayarak *.tsv
özniteliklerini koruyarak kopyalar .-p
bayrak .*.txt
mv
/ dizin / dosya adını değiştirenlerden daha yavaştır ve dosyaları farklı bir bölümde olmadıkça değiştirmeden değiştirir.