Ls ve mv ile ms-dos tarzı joker karakterleri nasıl kullanabilirim?


9

Bir MS-DOS arka plan geliyor gelen talihsizlik var - ama en azından bana ne kadar daha güçlü Linux olduğunu takdir ediyor. Linux-Fu'mı eşitlemek için çalışıyordum, ancak DOS ile yapılabilecek birkaç şey var , Linux ile en kolay şekilde nasıl yapacağımı bilmiyorum :

Birden Çok Dosyayı Yeniden Adlandırma - İki Joker Karakter Kullanma

c:\> dir

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt

c:\>rename *.txt *.bak

c:\> dir

Directory of c:\
    file1.bak
    file2.bak
    file3.bak
    file4.bak

find -execBurada kullanabileceğimi biliyorum ama daha kısa bir sözdizimi kullanmak mümkün - belki mvbazı özel bayraklar veya sözdizimi ile? Linux ilk sorun ile ilgili bir sorun olmamalıdır gibi bu anahtar ikinci * joker sanırım (yani nasıl joker karakter kullanarak yeniden adlandırmak istediğiniz dosyaları seçmek için biliyorum)

Tek Bir Dosyayı Yeniden Adlandırma - Bir Joker Karakter Kullanma

c:\> dir

Directory of c:\
    file1.txt

c:\>rename file1.txt *.bak

c:\> dir

Directory of c:\
    file1.bak

Bu, özellikle uzun ve kullanışsız dosya adlarını yeniden adlandırırken faydalı olacaktır. Belki de kabul edilebilir olacağını mv file1.txt $1.bakile bitirmek için kullanabileceğini düşündüm file1.txt.bakama $1bir kabuk komutu ile satır içi bir parametre başvurabilirsiniz emin değilim . Yine bu özel durumda, ms-dos *, dosya adının bir kısmı için bir tür yakalama / değiştirme eşleşmesi olarak kullanılacak joker karakteri nasıl piçleştiriyor .

Joker Karakterlerle Dizin Listelerini Filtreleme

c:\> dir

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt
    text.txt
    \temp       (directory) 

c:\> dir file*

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt

c:\> t*

Directory of c:\
    text.txt
    \temp       (directory) 

Bunu yapmak için doğru sözdiziminin ne olduğundan lsveya mümkün olup olmadığından emin değilim . Eğer böyle bir şey yapsaydım ls t*başlayarak dizinlere geri dönecekler t. Geçici çözümüm, ya ikisi gibi kısa ve basit olan find . --max-depth 1 -iname "t*"ya da benzeri bir şey kullanıyor .ls -al | grep tdir t*

Son olarak, bu uzun komutları kısaltmak için takma adlar ayarlayabileceğimi biliyorum, ancak bunları yapmak için hazır bazı linux-fu öğrenmek istiyorum, çünkü bazen uzak bir sisteme bağlı veya çalışıyorsunuz yeni bir makinede.

Peki nasıl olabilir mvve lsdosyalar aynı şekilde ben için kullanılan dirve renamedosyalar?

Yanıtlar:


15

Windows cmdve POSIX kabukları arasındaki temel farklılıklardan biri, joker karakter genişletmelerinden kimin sorumlu olduğudur. Kabuklar, istediğiniz gerçek komutları başlatmadan önce gerekli tüm genişletmeleri yapar. joker karakterleri cmd çoğunlukla değiştirilmemiş komutlara geçirir. (Ben istisnaları vardır düşünüyorum çünkü ben, çoğunlukla söylemek ve ortam değişkenleri çoğu koşulda genişletilir.) Bir yazılı Bu markaları renameile aynı sözdizimi ile çalışmak olacağını cmdoldukça zor.

Ancak renameLinux için bir - tamamen farklı argümanlarla, man sayfasını kontrol edin (sistemimde biraz ters ve sistemimde bulunan ve yaygın olarak mevcut olması gereken paketten renamegeliyor util-linux). İlk yeniden adınız şöyle yapılır:

rename .txt .bak *.txt

Kabuğun *genişleme yaptığını unutmayın, bu yüzden renamekendisi bunun böyle çağrıldığını düşünür:

rename .txt .bak file1.txt file2.txt file3.txt ...

Böylece tek dosya sürümünü tahmin edebilirsiniz:

rename .txt .bak file1.txt

Bunu renamekendiniz kullanmak istemiyorsanız, uygulamak istiyorsanız, bunun için bir işlev oluşturabilirsiniz. Yalnızca dosya uzantısını değiştirmek istediğinizi ve tek dosya yeniden adlandırmak için aşağıdakilere bakın:

$ function chext() {
  newext="$1"
  file="$2"
  newfile="${file%.*}$newext"
  echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv

$newfileorijinal uzantıyı çıkarmak için bir alt dize kaldırma kullanılarak oluşturulur , ardından yeni uzantıyı birleştirir. Bu işlevi, birden çok dosyayı nispeten kolayca işlemek için genişletebilirsiniz.


lsSorunuza gelince , -danahtarı kullanın . Bu ls, dizinlerin içeriğini listelemeyi önleyecektir .

Demo:

$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:29 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.csv
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Joker karakter yeniden adlandırma

$ rename .csv .txt f*
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Tek dosyayı yeniden adlandırma

$ rename .txt .csv f1.txt 
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Varsayılan ls

$ ls -l t*
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

test:
total 0
-rw-r--r-- 1 owner users 0 Jan  7 17:33 dont_show_me_please

ls dizinleri denetlemeyen

$ ls -ld t*
drwxr-xr-x 2 owner users 4096 Jan  7 17:33 test
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

çok hoş! Ben sadece linux-fu ile bir kemer yukarı taşındı düşünüyorum! Teşekkürler!
cwd

somefunc *.ExtBununla biraz ilerlemek için ipucu (ve tuzaklardan kaçınmak için): bu desen herhangi bir dosyayla eşleşmediğinde ne yapacağınızı görmek için basit işlevler veya komut dosyaları kullanın ve bir desen iletmeyi başarabileceğinizi görmek için tırnak işareti ile oynayın ( fonksiyonlar arasında genişlemeden). Emniyet ipucu: yok kullanmak rm:-) globbing / kabuk genişleme deneme sırasında her yerde
Mat

4

Joker karakter söz konusu olduğunda akılda tutulması gereken bir şey, kabuk tarafından genişletilmeleridir. Uygulama, joker karakterler kullanıp kullanmadığınızı veya adları yazıp yazmadığınızı bilmiyor. Örneğin, yazarsanız rename *.txt *.bak, renamekomut benzer bir şey görür rename file1.txt file2.txt existingfile.bak. Devam etmek için yeterli bilgi bu değil.

lsİlk olarak şu soruyu ele alacağım , çünkü daha basit. İstediğiniz tek şey eşleşen adlarsa, o zaman ihtiyacınız yoktur ls, çünkü kabuk zaten genişlemeyi yapıyor.

echo t*

Dosyalar hakkında daha fazla bilgi edinmek istiyorsanız , dizin içeriğini listelememesini söylemek için -dseçeneğine lsiletin.

ls -ld t*

İlk unix sistemleri bir tane ile birlikte gelmediğinden, dosyaları yeniden adlandırmak için standart bir yardımcı program yoktur. Dosyaları yeniden adlandırmak için taşınabilir yöntem bir döngü kullanır ve biraz ayrıntılıdır:

for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done

Dosyaları yeniden adlandırmak için birkaç yaygın yardımcı program vardır; bunların hiçbiri belirli bir unix sistemine yükleneceği garanti edilmez, ancak bunların tümü kolayca yüklenebilir. İşte ana olanlar:

  • renamedan util-linuxolmayan her gömülü Linux sisteminde (ve başka hiçbir yerde) geçerli paketi. Debian ve türevlerinde (Ubuntu dahil) bu komut çağrılır rename.ul. .txtSon uzantıdan başka bir oluşum olmaması şartıyla , yazabilirsiniz

    rename .txt .bak *.txt
    
  • renameDebian ve türevlerinin gönderdiği Perl betiğidir /usr/bin/rename. Dosyaları rastgele Perl komutlarına göre yeniden adlandırabilirsiniz.

    rename 's/\.txt\z/\.bak/' *.txt
    
  • mmv, birkaç ad tabanlı desene göre dosyaları yeniden adlandırabilir, kopyalayabilir ve bağlayabilir ve bir hedef adı zaten varsa ne olacağına ilişkin birçok seçeneğe sahiptir. Joker karakterleri kabuğun genişlemesine karşı korumak için tırnak işaretleri kullanmanız gerektiğini unutmayın.

    mmv '*.txt' '#1.txt'
    
  • zmvBir olan zsh mevcut fonksiyonu, eğer ve kabuk zsh ise. Rasgele zsh kalıplarıyla eşleşebilir (böylece dosya adlarını yalnızca joker karakterlerle değil, rastgele normal ifadelere göre eşleştirebilir ve dosyaları tarih ve boyut gibi diğer ölçütlerle eşleştirebilirsiniz). zmvayrıca kopyalayıp bağlayabilirsiniz.

    zmv '(*).txt' '$1.txt'
    

Kullandığınız makineler üzerinde bir miktar kontrole sahipseniz, tavsiyem zsh'ı kabuk olarak kullanmanız (bash üzerinde başka faydaları vardır) ve bu satırları şuraya koymaktır ~/.zshrc:

autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'

noglobKabuğa komut argümanında joker karakter genişletmemesini söyleyen bir zsh özelliğidir. Bu şekilde yazabilirsiniz zmv *.txt \$1.txt( $değiştirilen metinde her zaman korumanız gerekir ).

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.