Pindahkan sekelompok file, meminta pengguna untuk konfirmasi untuk setiap file

9

Sistem: Ubuntu MATE 18.04.

Saya memiliki koleksi file (dalam banyak direktori dalam struktur direktori) dan saya ingin memindahkan banyak dari mereka ke direktori lain. Saya dapat mengetahui file mana yang ingin saya pindahkan dengan namanya (itu adalah judul resep), tetapi tidak ada cara lain untuk membedakan antara file yang ingin saya pindahkan dan file yang tidak ingin saya pindahkan; Saya perlu membuat keputusan untuk setiap file dengan memeriksa nama sendiri.

Jadi, saya menjalankan perintah sekali untuk setiap file yang ingin saya pindahkan, seperti

mv Snacks/OkaraCrackers NeedsTesting/
mv Snacks/SunflowerBrittle NeedsTesting/
mv Treats/ChocolateChilliFudge NeedsTesting/
mv Treats/PecanBlondies NeedsTesting/

Bahkan dengan penyelesaian tab ini terlalu banyak mengetik. Yang benar-benar ingin saya lakukan adalah sesuatu seperti

shopt -s globstar
mv --prompt-me-for-every-file ** NeedsTesting/

Jadi saya bisa tekan yatau nuntuk setiap file.

Bagaimana saya bisa memindahkan sekelompok file dan diminta untuk konfirmasi untuk setiap file?

Zanna
sumber

Jawaban:

6

Cara 1: Di browser file grafis Anda, menggunakan tampilan hierarki

Saya berasumsi tujuan Anda sebenarnya adalah membuat pilihan untuk setiap file, dan tidak secara tegas diminta . Namun, jika Anda lebih suka diminta tentang setiap file di terminal, lihat Cara 2 di bawah ini.

Sebagian besar browser file grafis mendukung tampilan hierarki di mana Anda dapat melihat beberapa level hierarki direktori secara bersamaan. Anda dapat menyalin atau memindahkan file dari tampilan ini, baik secara individu atau dengan memilihnya dan kemudian beroperasi pada seluruh pilihan. Ini berfungsi bahkan dengan file dari banyak folder.

Di beberapa browser file, seseorang harus masuk ke menu Preferensi untuk mengaktifkan tampilan hierarki. Di Caja, browser file MATE, selalu diaktifkan pada tampilan daftar. Klik Lihat → Daftar (atau tekan Ctrl+ 2) untuk beralih ke tampilan daftar. Setiap direktori memiliki segitiga kecil yang menghadap ke kanan di sebelah kiri, yang mengindikasikan dapat diperluas. Untuk membuka folder, klik segitiga itu, atau tekan tombol (panah kanan) ketika folder tersebut dipilih. Dalam contoh ini, saya telah memilih semuanya satu per satu dan menyeret semuanya sekaligus ke tujuan mereka:

beberapa file dipilih dalam struktur pohon di browser file Caja, diseret ke folder lain tetapi belum dipindahkan

Dengan asumsi sumber dan tujuan berada pada drive yang sama, menyeret gerakan secara default. Jika Anda ingin menyalin sebagai gantinya, Anda akan menahan Ctrltombol.

situasi setelah seret-pindah selesai, di mana file yang dipilih sekarang semua bersama-sama di folder tujuan bukannya lokasi terpisah asli mereka

Secara teori, mudah untuk memperbaiki kesalahan saat menggunakan metode ini, karena sebagian besar browser file (termasuk Caja) mendukung Ctrl+ Zuntuk membatalkan tindakan terbaru, termasuk tindakan batch. Namun, saya beruntung karena itu. Terkadang file kembali ke folder yang salah.

Kabar baiknya adalah bahwa Anda tampaknya bekerja dengan sebagian besar dokumen teks, yang cenderung kecil, sehingga Anda dapat membuat cadangan tambahan tarterlebih dahulu tanpa banyak kesulitan. Saya sarankan melakukan itu terlepas dari metode apa yang Anda gunakan.

Cara 2 : findPerintah dengan -okaksi

Ini umum digunakan finduntuk menemukan file dan meneruskan jalur mereka ke perintah eksternal yang sewenang-wenang dengan -execdan -execdirtindakan. Tetapi findjuga memiliki -okdan -okdirmeminta itu sebelum setiap kali mereka menjalankan perintah. Jika Anda benar-benar ingin diminta di terminal tentang setiap file, saya pikir ini adalah cara untuk pergi.

Ketika dilakukan untuk menghasilkan efek yang sama seperti yang ditunjukkan di atas, yang terlihat seperti ini:

ek@Gnar:~$ find Texts -xtype f -ok mv -t 'Glorious Destination Folder' {} \;
< mv ... Texts/Robert Frost/New Hampshire.pdf > ? y
< mv ... Texts/Robert Frost/In The Clearing.pdf > ? n
< mv ... Texts/Helen Keller/The Story of My Life.pdf > ? y
< mv ... Texts/Saki/The Short Stories of Saki.pdf > ? y
< mv ... Texts/Jane Austen/Sense and Sensibility.pdf > ? n
< mv ... Texts/Jane Austen/Pride and Prejudice.pdf > ? y
< mv ... Texts/Richard Connell/The Stolen Crime.pdf > ? n
< mv ... Texts/Richard Connell/The Most Dangerous Game.txt > ? y
< mv ... Texts/Mary Wollstonecraft Shelley/Mathilda.epub > ? n
< mv ... Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf > ? y
< mv ... Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf > ? n
< mv ... Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm > ? y

Ganti Textsdengan direktori sumber (yang bisa saja .jika Anda akan cdmelakukannya) dan Glorious Destination Folderdengan direktori tujuan yang sebenarnya.

Ini menjalankan satu perintah per file; tidak seperti -execdan -execdir, -okdan -okdirtidak mendukung +di tempat \;untuk lulus beberapa jalur berhasil ditemukan dalam doa yang sama dari perintah. Akibatnya, Anda tidak perlu menggunakan -t destbentuk mv. Saya sarankan tetap melakukannya, baik secara umum dengan finddan khususnya dalam situasi ini sehingga prompt lebih mirip dengan perintah yang diminta.

Ketika perintah itu ditulis, jika findmenemukan tautan simbolis yang pada akhirnya menunjuk ke file biasa, itu (tautan, bukan target) dipindahkan daripada diabaikan. Jika Anda benar-benar ingin mengoperasikan hanya satu file biasa, gunakan -type fsaja -xtype f.

Anda mungkin ingin melakukan ini dalam satu scriptsesi sehingga Anda bisa mencari tahu apa yang terjadi jika Anda melakukan kesalahan. Tetapi sekali lagi, tidak ada alasan untuk tidak memiliki cadangan.

Cara 3: Hasilkan manifes dan edit

Setidaknya selama file tidak memiliki baris baru dalam namanya, Anda bisa mulai dengan menggunakan findperintah sederhana untuk membuat manifes - file yang mencantumkan nama file yang Anda (dalam hal ini berpotensi) tertarik pada :

find Texts -xtype f >manifest

Ganti manifestdengan nama apa pun yang Anda suka untuk file yang berisi daftar file yang sedang dipertimbangkan (dan sesuaikan arah yang tersisa sesuai).

Seperti di atas, ganti Textsdengan direktori sumber Anda yang sebenarnya, yang bisa jadi .jika Anda sudah cdmelakukannya. Namun, jika Textsadalah jalur relatif (termasuk jika itu .) maka Anda harus memastikan berada di lokasi yang sama nanti ketika Anda benar-benar melakukan gerakan.

Setelah menjalankan findperintah itu, buka manifestdi editor teks. Ini bisa menjadi nano, vim, emacs, gedit, pluma, dll editor, komentar keluar garis yang nama file yang Anda tidak ingin pindah dengan menempatkan #pada awal mereka. Beberapa editor akan menyoroti garis-garis itu secara berbeda bahkan ketika itu tidak mengenali file Anda dari format apa pun yang diketahuinya memiliki komentar. Sebagian besar tidak akan, dan alasan sebenarnya saya menyarankan untuk melakukannya dengan cara ini adalah bahwa Anda, sebagai manusia, cenderung memiliki pengalaman mengomentari baris dalam file konfigurasi (dan mungkin dalam kode sumber). Saya pikir ini lebih intuitif, dan lebih sedikit rawan kesalahan, daripada menandai garis yang ingin Anda pindahkan.

Tentu saja, Anda bisa menghapus saja baris untuk file yang tidak ingin Anda pindahkan. Keuntungan dari mengomentari mereka adalah nanti akan jelas apa yang Anda lakukan.

Dalam contoh saya, ini adalah apa yang tampak seperti isi file setelah saya mengeditnya:

Texts/Robert Frost/New Hampshire.pdf
# Texts/Robert Frost/In The Clearing.pdf
Texts/Helen Keller/The Story of My Life.pdf
Texts/Saki/The Short Stories of Saki.pdf
# Texts/Jane Austen/Sense and Sensibility.pdf
Texts/Jane Austen/Pride and Prejudice.pdf
# Texts/Richard Connell/The Stolen Crime.pdf
Texts/Richard Connell/The Most Dangerous Game.txt
# Texts/Mary Wollstonecraft Shelley/Mathilda.epub
Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf
# Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf
Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm

Kemudian Anda dapat memfilter garis komentar dengan grepdan pipa hasilnya xargsuntuk meneruskannya ke mv:

grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'

Seperti di atas, ganti Glorious Destination Folderdengan nama tujuan yang sebenarnya. Itu dia; file Anda dipindahkan. Anda tentu saja dapat menulis echosebelumnya mvuntuk melihat perintah yang akan dijalankan terlebih dahulu, jika Anda mau.

Cara perintah itu bekerja adalah:

  1. The grepperintah baris output dari manifestyang tidak ( -v) mulai ( ^) dengan opsional ( *) spasi ( \s) diikuti oleh literal #karakter. The -Pbendera pilih PCRE sebagai dialek ekspresi reguler (yang memungkinkan \syang saya anggap lebih mudah dibaca daripada tradisional [[:space:]]).
  2. The xargsperintah membagi input (yang merupakan output dari grep) ke bidang baris-dihentikan ( -d '\n'), maka pasta masing-masing bidang (tanpa baris baru terminating) sebagai argumen yang terpisah pada akhir perintah mv -t 'Glorious Destination Folder', yang berjalan.
Eliah Kagan
sumber
1
-okIMHO jawaban terbaik
pim
7

Berikut ini skrip kecil ( mv-confirm.sh):

#!/bin/bash

# Just make sure there are at least one source and one destination
if [ "$#" -lt 2 ]; then
    echo "Illegal number of parameters"
fi

DESTINATION=${*:$#}             # last argument
SOURCES=( ${@:1:$#-1} )         # all but last arguments

for i in "${SOURCES[@]}"
do
    read -p "move '$i' to '$DESTINATION' ? [y/n] " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
        echo mv "$i" "$DESTINATION"
    fi
done

Penggunaan sampel:

./mv-confirm.sh ** somewhere
move 'a' to 'somewhere' ? [y/n] n
move 'b' to 'somewhere' ? [y/n] y
mv b d
...

jangan lupa untuk membuat skrip dapat dieksekusi ( chmod +x mv-confirm.sh).

NB

Karena saya tidak ingin mengacaukan file Anda, saya menambahkan echosebelum mv perintah yang sebenarnya . Jangan ragu untuk menghapusnya karena benar-benar memindahkan file.

pim
sumber