Jadi, jika saya berada di direktori home saya dan saya ingin memindahkan foo.c ke ~ / bar / baz / foo.c, tetapi direktori-direktori itu tidak ada, apakah ada cara untuk membuat direktori-direktori tersebut secara otomatis dibuat, sehingga Anda hanya perlu mengetik
mv foo.c ~/bar/baz/
dan semuanya akan berhasil? Sepertinya Anda bisa alias mv ke skrip bash sederhana yang akan memeriksa apakah direktori tersebut ada dan jika tidak akan memanggil mkdir dan kemudian mv, tapi saya pikir saya akan memeriksa untuk melihat apakah ada yang punya ide yang lebih baik.
Jawaban:
Bagaimana dengan one-liner ini (dalam bash):
Hancurkan itu:
membuat direktori (termasuk semua direktori perantara), setelah itu:
memindahkan file ke direktori tersebut ($ _ meluas ke argumen terakhir yang dilewatkan ke perintah shell sebelumnya, yaitu: direktori yang baru dibuat).
Saya tidak yakin seberapa jauh ini akan berhasil di shell lain, tetapi mungkin memberi Anda beberapa ide tentang apa yang harus dicari.
Berikut adalah contoh menggunakan teknik ini:
sumber
./
mana-mana? Args bukan perintah di PATH tanpa.
direktori ...--parents
tidak tersedia di macOS 10.13.2. Anda harus menggunakan-p
.mkdir -p ./some/path/foo; mv yourfile.txt $_:h
sumber
dirname
tidak memerlukan argumennya, itu murni manipulasi string. Tidak dapat berbicara untuk distribusi lainnya. Tidak ada yang salah dengan kode ini.for f in *.txt; do mkdir -p `dirname /destination/${f//regex/repl}`; mv "$f" "/destination/${f//regex/repl}; done
Simpan sebagai skrip bernama mv atau mv.sh
Atau letakkan di akhir file ~ / .bashrc Anda sebagai fungsi yang menggantikan mv default pada setiap terminal baru. Menggunakan fungsi memungkinkan bash menyimpannya dalam memori, alih-alih harus membaca file skrip setiap saat.
Ini berdasarkan pada pengajuan Chris Lutz.
sumber
mv
perintah yang ditingkatkan . Terutama berguna untuk skrip, yaitu Anda tidak perlu ingin menjalankan pemeriksaan dan menjalankanmkdir -p
kapan saja Anda perlu menggunakanmv
. Tapi karena saya ingin perilaku kesalahan defaultmv
, saya mengubah nama fungsi menjadimvp
- sehingga saya tahu kapan saya bisa membuat direktori.[ ! -a "$dir" ]
saya telah melakukan percobaan dengan bagian kanan menjadi benar dan salah, keduanya dievaluasi menjadi benar .. ??? Demi yang lain, tmp = "$ {tmp: -1}" muncul untuk mengambil karakter terakhir dari file untuk memastikan itu bukan path (/)Anda bisa menggunakan
mkdir
:Script sederhana untuk melakukannya secara otomatis (belum diuji):
sumber
Sepertinya jawabannya tidak :). Saya tidak benar-benar ingin membuat alias atau func hanya untuk melakukan ini, sering karena ini satu kali dan saya sudah di tengah mengetik
mv
perintah, tetapi saya menemukan sesuatu yang bekerja dengan baik untuk itu:Jika
mv
gagal (dir tidak ada), itu akan membuat direktori (yang merupakan argumen terakhir ke perintah sebelumnya, begitu$_
juga). Jadi jalankan saja perintah ini, lalu upjalankan kembali, dan kali inimv
harus berhasil.sumber
Script shell berikut, mungkin?
Itulah bagian dasarnya. Anda mungkin ingin menambahkan sedikit untuk memeriksa argumen, dan Anda mungkin ingin perilaku berubah jika tujuan ada, atau direktori sumber ada, atau tidak ada (yaitu jangan menimpa sesuatu yang tidak ada) .
sumber
perintah rsync dapat melakukan trik hanya jika direktori terakhir di jalur tujuan tidak ada, misalnya untuk jalur tujuan
~/bar/baz/
jikabar
ada tetapibaz
tidak, maka perintah berikut dapat digunakan:rsync -av --remove-source-files foo.c ~/bar/baz/
Dalam hal ini
baz
direktori akan dibuat jika tidak ada. Tetapi jika keduanyabar
danbaz
tidak ada, rsync akan gagal:Jadi pada dasarnya itu harus aman digunakan
rsync -av --remove-source-files
sebagai alias untukmv
.sumber
Cara paling sederhana untuk melakukannya adalah:
Misalkan saya mengunduh file pdf yang terletak di direktori unduhan saya (
~/download
) dan saya ingin memindahkan semuanya ke direktori yang tidak ada (katakanlahmy_PDF
).Saya akan mengetik perintah berikut (memastikan direktori kerja saya saat ini adalah
~/download
):Anda dapat menambahkan
-p
opsimkdir
jika Anda ingin membuat subdirektori seperti ini: (seharusnya saya ingin membuat subdirektori bernamapython
):sumber
Sillier, tetapi cara kerjanya:
Buat direktori dengan mkdir -p termasuk direktori sementara yang membagikan nama file tujuan, kemudian hapus direktori nama file itu dengan rmdir sederhana, kemudian pindahkan file Anda ke tujuan yang baru. Saya pikir jawaban menggunakan dirname mungkin yang terbaik.
sumber
sumber
Kode:
Contoh:
argumen: "d1" "d2 / sub"
sumber
Ini akan pindah
foo.c
ke direktori barubaz
dengan direktori indukbar
.The
-p
pilihan untukmkdir
akan membuat direktori menengah seperti yang diperlukan.Tanpa
-p
semua direktori di jalur awalan harus sudah ada.Segala sesuatu di dalam backtick
``
dieksekusi dan output dikembalikan in-line sebagai bagian dari perintah Anda.Karena
mkdir
tidak mengembalikan apa pun, hanya output dari yangecho $_
akan ditambahkan ke perintah.$_
referensi argumen terakhir ke perintah yang dieksekusi sebelumnya.Dalam hal ini, ini akan mengembalikan path ke direktori baru Anda (
~/bar/baz/
) yang diteruskan kemkdir
perintah.Saya membuka ritsleting arsip tanpa memberikan tujuan dan ingin memindahkan semua file kecuali
demo-app.zip
dari direktori saya saat ini ke direktori baru yang disebutdemo-app
.Baris berikut melakukan trik:
ls -A
mengembalikan semua nama file termasuk file tersembunyi ( kecuali untuk yang implisit.
dan..
).Simbol pipa
|
digunakan untuk menyalurkan output darils
perintah kegrep
( utilitas pencarian teks-baris perintah ).The
-v
bendera mengarahkangrep
untuk menemukan dan mengembalikan semua nama file tidak termasukdemo-app.zip
.Daftar file itu ditambahkan ke baris perintah kami sebagai argumen sumber ke perintah pindah
mv
. Argumen target adalah jalur ke direktori baru yang dilewati untukmkdir
menggunakan referensi$_
dan menggunakan keluaranecho
.sumber
Anda bahkan dapat menggunakan ekstensi brace:
Anda harus menggunakan bash 3.0 atau yang lebih baru.
sumber
sumber
Solusi satu string saya:
sumber
Anda dapat membuat perintah:
mkdir ~/bar/baz | mv foo.c ~/bar/baz/
atau skrip shell ada di sini:
1. Buka editor teks apa saja
2. Skrip shell salin-tempel .
3. Simpan sebagai mkdir_mv.sh
4. Masukkan direktori skrip Anda:
cd your/script/directory
5. Ubah mode file :
chmod +x mkdir_mv.sh
6. Tetapkan alias :
alias mv="./mkdir_mv.sh"
Sekarang, setiap kali Anda menjalankan
mv
direktori pemindahan perintah akan dibuat jika tidak ada.sumber
Berdasarkan komentar pada jawaban lain, inilah fungsi shell saya.
Sertakan ini dalam .bashrc atau yang serupa sehingga Anda dapat menggunakannya di mana saja.
sumber