ファイルのグループを移動し、ユーザーにすべてのファイルの確認を求めます


9

システム:Ubuntu MATE 18.04。

(ディレクトリ構造の複数のディレクトリにある)ファイルのコレクションがあり、それらの多くを別のディレクトリに移動したい。移動したいファイルは名前(レシピのタイトル)でわかりますが、移動したいファイルと移動したくないファイルを区別する方法は他にありません。自分で名前を調べて、すべてのファイルを決定する必要があります。

だから、私は移動したいファイルごとに1回コマンドを実行しています

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

タブ補完があっても、これはタイピングが多すぎます。私が本当にやりたいことは

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

したがって、ファイルごとにyまたはnを押すだけです。

ファイルのグループを移動して、すべてのファイルの確認を求めるにはどうすればよいですか?

回答:


6

方法1:グラフィカルファイルブラウザーでツリービューを使用する

私はあなたの実際の目標は各ファイルの選択をすることであり、厳密に言うとプロンプト出されることでないと思います。ただし、ターミナル内の各ファイルについてプロンプトを表示したい場合は、以下の方法2を参照してください。

ほとんどのグラフィカルファイルブラウザはツリービューをサポートしており、ディレクトリ階層の複数のレベルをまとめて表示できます。個別に、またはファイルを選択してから選択全体を操作することにより、このビューからファイルをコピーまたは移動できます。これは、複数のフォルダのファイルでも機能します。

一部のファイルブラウザでは、ツリービューを有効にするには、[設定]メニューに移動する必要があります。MATEファイルブラウザーのCajaでは、リストビューで常に有効になっています。[表示]→[リスト]をクリックして(またはCtrl+を押して2)、リストビューに切り替えます。各ディレクトリの左側には、右向きの小さな三角形があり、展開できることを示しています。フォルダを展開するには、その三角形をクリックするか、フォルダが選択されているときに(右矢印)キーを押します。この例では、すべてを1つずつ選択し、それらを一度にドラッグして宛先を指定しています。

Cajaファイルブラウザのツリー構造で選択された複数のファイルが別のフォルダにドラッグされているが、まだ移動されていない

ソースと宛先が同じドライブ上にあると想定すると、ドラッグはデフォルトで移動します。代わりにコピーしたい場合は、Ctrlキーを押したままにします。

ドラッグムーブが完了した後の状況。選択されたファイルは、元の個別の場所ではなく、宛先フォルダーにすべてまとめられています。

理論的には、この方法を使用すると、ほとんどのファイルブラウザー(Caja を含む)がバッチアクションを含む最近のアクションを元に戻すCtrl+ Zをサポートするため、間違いを簡単に修正できます。しかし、私はそれと運が混ざっています。時々、ファイルは間違ったフォルダに戻ります。

良いニュースは、ほとんどがテキストドキュメントで作業しているように見えることです。これは、サイズが小さい傾向があるため、tar手間をかけずに最初に追加のバックアップを作成できます。使用する方法に関係なく、それを行うことをお勧めします。

方法2:アクションfind付きのコマンド-ok

findファイルを検索し、-execその-execdirアクションを使用して任意の外部コマンドにパスを渡すのが一般的な使用方法です。ただし、コマンドを実行するたびに、その前にプロンプ​​トfindが表示されます。ターミナルで各ファイルについてプロンプトを表示したい場合は、これが適切な方法だと思います。-ok-okdir

上記と同じ効果を生成するために完了すると、次のようになります。

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

Textsソースディレクトリ(必要な.場合のみcd)とGlorious Destination Folder実際の宛先ディレクトリに置き換えます。

これにより、ファイルごとに1つのコマンドが実行されます。異なり、-execそして-execdir-okそして-okdirサポートしていない+の代わりに、\;コマンドの同じ呼び出しで複数FOUNDパスを渡します。したがって、の形式を使用する必要ありません。とにかく、そうすることをお勧めしますが、一般的に、特にこの状況の両方、プロンプトはプロンプトが表示されているコマンドのように見えます。-t destmvfind

そのコマンドが記述されているときに、find最終的に通常のファイルを指すシンボリックリンクに遭遇した場合、そのリンク(ターゲットではなくリンク)は無視されるのではなく移動されます。通常のファイルを1つだけ操作したい場合は、の-type f代わりに使用してください-xtype f

あなたには、これを行うことができますscript、あなたがミスをした場合に何が起こったかを把握できるようにしたセッション。しかし、繰り返しになりますが、バックアップがない理由はありません。

方法3:マニフェストを生成して編集する

少なくとも、ファイルの名前に改行が含まれていない限り、簡単なfindコマンドを使用してマニフェストを生成することから始めます。このファイルには、(この場合は)興味があるファイルの名前がリストされています。 :

find Texts -xtype f >manifest

manifest検討中のファイルをリストするファイルの名前を任意の名前に置き換えます(それに応じて残りの方向を調整します)。

上記のように、置き換えるTextsことができ、あなたの実際のソースディレクトリ、と.あなたがしている場合cd、それをD」を。ただし、Texts(それはだ場合を含む相対パスである.)そして、次のことを行う必要があり、同じ場所にあることを確認してくださいあなたが実際に移動を実行するときに、後で。

そのfindコマンドを実行した後manifest、テキストエディターで開きます。これは可能性がありnanovimemacsgeditpluma、エディタでは、などコメントアウト名前のファイルは、あなたがいることを行いない配置することにより、移動したい#それらの初めに。一部のエディターは、ファイルがコメント付きであることがわかっている形式であると認識しない場合でも、これらの行を異なる方法で強調表示します。ただし、ほとんどの場合はそうではありません。この方法で実行することをお勧めする本当の理由は、人間として、構成ファイル(およびおそらくソースコード)の行をコメントアウトした経験がある可能性が高いためです。これは、移動たい行をマークするよりも直感的で、エラーが発生しにくいと思います。

もちろん、代わりに、移動したくないファイルの行を削除することもできます。コメントアウトすることの利点は、後で何をしたかが明らかになることです。

私の例では、編集後のファイルの内容は次のようになります。

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

次に、コメント化された行をフィルターで除外しgrep、結果をパイプして次の行xargsに渡しますmv

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

上記のようGlorious Destination Folderに、実際の宛先の名前に置き換えます。それでおしまい; ファイルが移動されます。もちろん、echomvに書いて、必要に応じて最初に実行されるコマンドを確認することもできます。

このコマンドが機能する方法は次のとおりです。

  1. grep以下からのコマンドの出力行manifestことない-v)(起動^オプション(と)*)空白(\sリテラルが続く)#文字。-Pフラグは(可能にする正規表現の方言としてPCREを選択し\s、私は伝統的なよりも読みやすい検討しています[[:space:]])。
  2. xargsコマンド(の出力であり、その入力を分割grep(改行で終了フィールドに)-d '\n'、コマンドの終了時に別の引数として(終端改行せず)は、各フィールドを貼り付け、)mv -t 'Glorious Destination Folder'それが実行され、。

1
-okIMHOのベストアンサー
ピム

7

次に小さなスクリプト(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

使用例:

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

スクリプトを実行可能にすることを忘れないでください(chmod +x mv-confirm.sh)

NB

ファイルをいじりたくないのでecho、実際のmv コマンドの前に追加しました。実際にファイルを移動する場合は、自由に削除してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.