GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa menggunakan wildcard gaya ms-dos dengan ls dan mv?

Salah satu perbedaan mendasar antara cmd Windows dan shell POSIX yang bertanggung jawab untuk ekspansi wildcard. Kerang melakukan semua perluasan yang diperlukan sebelum memulai perintah aktual yang Anda minta. cmd kebanyakan meneruskan pola wildcard ke perintah yang tidak dimodifikasi. (Saya katakan sebagian besar, karena menurut saya ada pengecualian, dan variabel lingkungan diperluas dalam sebagian besar keadaan.) Ini membuat penulisan rename yang akan bekerja dengan sintaks yang sama seperti di cmd cukup rumit.

Tapi ada rename untuk Linux - dengan argumen yang sangat berbeda, periksa halaman manual (yang agak singkat di sistem saya, dan rename berasal dari util-linux paket di sistem saya, yang seharusnya tersedia secara luas). Ganti nama pertama Anda akan dilakukan seperti ini:

rename .txt .bak *.txt

Perhatikan bahwa shell melakukan * ekspansi, jadi rename sendiri sebenarnya mengira itu dipanggil seperti ini:

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

Jadi Anda bisa menebak versi file tunggal:

rename .txt .bak file1.txt

Jika Anda tidak ingin menggunakan rename tetapi terapkan ini sendiri, Anda dapat membuat fungsi untuk itu. Dengan asumsi Anda hanya ingin mengubah ekstensi file, dan untuk mengganti nama satu file, lihat ini:

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

$newfile dibangun menggunakan penghapusan substring untuk menghapus ekstensi asli, lalu menggabungkan ekstensi baru. Anda dapat memperluas fungsi tersebut untuk menangani banyak file dengan relatif mudah.

Adapun ls Anda pertanyaan, gunakan -d mengalihkan. Ini akan mencegah ls dari daftar isi direktori.

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

Ganti nama karakter pengganti

$ 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

Ganti nama file tunggal

$ 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

ls default

$ 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 yang tidak memeriksa direktori

$ 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

Satu hal yang perlu diingat ketika datang ke wildcard adalah mereka diperluas oleh shell. Aplikasi tidak tahu apakah Anda menggunakan wildcard atau mengetik nama. Misalnya, jika Anda mengetik rename *.txt *.bak , lalu rename perintah melihat sesuatu seperti rename file1.txt file2.txt existingfile.bak . Itu tidak cukup informasi untuk melanjutkan.

Saya akan menangani pertanyaan tentang ls pertama, karena lebih sederhana. Jika yang Anda inginkan hanyalah nama yang cocok, maka Anda tidak memerlukan ls , karena shell sudah melakukan ekspansi.

echo t*

Jika Anda ingin informasi lebih lanjut tentang file tersebut, berikan -d opsi untuk ls , untuk memberi tahu agar tidak mencantumkan konten direktori.

ls -ld t*

Tidak ada utilitas standar untuk mengganti nama file, karena sistem unix pertama tidak memilikinya. Metode portabel untuk mengganti nama file menggunakan loop dan sedikit bertele-tele:

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

Ada beberapa utilitas umum untuk mengganti nama file, tidak ada yang dijamin dapat diinstal pada sistem unix tertentu, tetapi semuanya mudah diinstal. Inilah yang utama:

  • rename dari util-linux suite, tersedia di setiap sistem Linux non-embedded (dan tidak di tempat lain). Di Debian dan turunannya (termasuk Ubuntu), perintah ini disebut rename.ul . Asalkan tidak ada kemunculan .txt selain ekstensi terakhir, Anda dapat menulis

    rename .txt .bak *.txt
    
  • rename adalah skrip Perl yang dikirimkan oleh Debian dan turunannya sebagai /usr/bin/rename . Anda dapat mengganti nama file sesuai dengan perintah Perl yang sewenang-wenang.

    rename 's/\.txt\z/\.bak/' *.txt
    
  • mmv , yang dapat mengganti nama, menyalin, dan menautkan file menurut beberapa pola berbasis nama dan memiliki banyak opsi terkait dengan apa yang terjadi jika nama target sudah ada. Perhatikan bahwa Anda harus menggunakan tanda kutip untuk melindungi karakter pengganti dari ekspansi oleh shell.

    mmv '*.txt' '#1.txt'
    
  • zmv adalah fungsi zsh, tersedia jika dan hanya jika shell Anda adalah zsh. Itu dapat mencocokkan pola zsh arbitrer (sehingga Anda dapat mencocokkan nama file sesuai dengan ekspresi reguler arbitrer, bukan hanya wildcard, dan Anda dapat mencocokkan file dengan kriteria lain seperti tanggal dan ukuran). zmv juga dapat menyalin dan menautkan.

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

Jika Anda memiliki kendali atas mesin yang Anda gunakan, rekomendasi saya adalah menggunakan zsh sebagai shell Anda (ini memiliki manfaat lain dibandingkan bash) dan letakkan baris ini di ~/.zshrc Anda :

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

noglob adalah fitur zsh yang memberi tahu shell untuk tidak memperluas wildcard dalam argumen perintah. Dengan cara ini Anda dapat menulis zmv *.txt \$1.txt (Anda harus selalu melindungi $ dalam teks pengganti).


Linux
  1. Cara Bekerja Dengan Pengguna Dan Grup Di Linux

  2. Bagaimana saya bisa menggunakan dialog peringatan dengan Python di linux?

  3. Bagaimana saya bisa menggunakan SSH dengan proxy SOCKS 5?

  1. Cara Menggunakan Perintah 'cat' dan 'tac' dengan Contoh di Linux

  2. Cara Menggunakan Pipes dan Named Pipes di Linux (dengan Contoh)

  3. Bagaimana cara menggunakan wildcard dalam perintah xargs?

  1. Bagaimana Cara Menggunakan Pengalihan Output Dalam Kombinasi Dengan Dokumen Di Sini Dan Cat?

  2. Cara Menggunakan Perintah Shutdown dan Reboot Linux dengan Contoh

  3. Cara Mengonfigurasi SSH untuk membatasi Pengguna/Grup dengan perintah izinkan dan tolak