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 mvbu ş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 mvbu ş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 mvsatırda olan şey , kabuğun*.txt eşleşen dosyalara genişlemesidir . Değişmeyen *.tsvdosya olmadığı için.
mvKomut 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
mvSon 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
mvKomut ile yürütülür:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
Şimdi, tekrar mvolup *.tsvolmadığını kontrol edin . Değil gibi dosyaya file1.txttaşınır *.tsv. Yani: dosya, *.tsvyı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
mvKomut ile yürütülür:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Gibi *.tsvartık bir dizindir, varlık kadar dosyalar uçları orada taşındı.
Şimdi: some_command *.tsvniyetin 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: mvkomut 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_DIRseç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 mvile ç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 mvhiç 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ı olanmvilk 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..bedSonunda az önce, kalan bir değişken, birleştirir ile, yeni oluşturmatest#.bedtest#.beddosya adını.Alt çizgi 0 $ için bir yer tutucudur
{}Her (yerine*.gappedPeakgöre bulunan) dosyafindkomutu ve olur 1 $ içinshkomuta.
\;-execkomutun 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; mvbir seferde yalnızca bir dosyayı yeniden adlandırabilir. Açıklamaları yanlış anladınız veya yanlış.
mmvve renameaynı anda birkaç dosyayı yeniden adlandırabilir. Ancak renamefarklı olarak adlandırılan etrafında iki versiyonu var . Bununla ilgili bir sürü soru olmalı.
rename, kullanmaz mv.
mv *.txt *.tsv mviçeride (genellikle) kabuk genişletilmiş dosya adlarını görmez *.txtveya görür *.tsv. Bu joker karakterlerin genişlettiği dosya sayısı "rasgele" olur. Bunun çalıştığı tek durum, isminin *.txtdeğişmesi gereken bir dosya varsa (kelimenin tam anlamıyla) *.tsv( bashseçenek belirtilmeden nullglobayarlanmamalıdır).
foo.txtve bir adlandırılmış varolan üzerine yazar dosyayı ...baz.tsvmv *.txt *.tsv.tsv
Örneğin , komutu çalıştırdığınızda dizinde bulunan dosyalar varsa asd.txtve bu iki dosyayı adlandırılmış bir dizine taşımaya çalışır . Böyle bir dizin olmadığı için hata veriyor.qwe.txtmv *.txt *.tsv*.tsv
rename(1)renameperl 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 renameDebian / 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
*.txtdosyaları kopyalayarak *.tsvözniteliklerini koruyarak kopyalar .-p bayrak .*.txtmv/ 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.