cp -iでキーストロークを避けることはできますか?

cp -iでキーストロークを避けることはできますか?

私はしばしば同様の方法で長いファイルのリストを選択的に保持する必要があり、プロセスを高速化するには各ファイルでキーを押すのcp -iarではなくキーを押すだけです。つまり、 と を押す必要がないようにしたいと思います。もちろん、代わりに別のキーを使用すると良いでしょう。ynENTERENTERynyn

これを行う方法はありますか?

答え1

私の考えでは、Midnight Commanderのようなファイルマネージャが必要なようです。 mcでは、insertまたは+を使用して複数のファイルを選択、削除、移動、またはコピーできます。完全なガイドラインとヒントは、以下で確認できます。地図時間

file0〜file10がありますが、file1とfile3のみをコピーするとし、純粋なシェルコマンド(GUIなし)を試している場合:

cp file1 file3 directory/

もちろん、シェルを使って自分自身を助けることができます。

cp file{1,3} directory/

しかし、連続的なケースはどうですか?ファイル5をファイル10に?

cp file{5..10} directory/

より高度な機能が必要な場合は、find次のように助けることができます。

find Downloads -name "*.cfg" -exec cp {} directory \;

します:

copy Downloads/file(6).cfg to directory
copy Downloads/file(7).cfg to directory
copy Downloads/file(1).cfg to directory
copy Downloads/file.cfg to directory
copy Downloads/file(2).cfg to directory
copy Downloads/file(4).cfg to directory
copy Downloads/file(3).cfg to directory
copy Downloads/file(5).cfg to directory

コピーしたいファイルを確認し、その-exec ...部分を削除できます。-exec echo cp ...findが何であるか疑問に思うなら、それを使うこともできます。

答え2

はい、可能です。しかし、少し複雑です。ここでは、このbashスクリプトをインポートしてPATHに入れる名前のファイル
に保存し、明らかにいくつかの改善が必要であることを忘れないでください。mycp.shchmod +x mycp.

#!/bin/bash
[ $# -ne 2 ] && echo -en "ERROR : Need 2 parameters.\n" && exit
[ -f $1 ] && cp $1 $2
if [ -d $1 ]  
then
    mkdir -p $2
    cd $1
    find . | while read fn
    do
        if [ -f $fn ] 
        then
            read -r -n1 yesorno
            if [ "$yesorno" == "y" ] || [ "$yesorno" == "Y" ]  
            then 
                mkdir -p $2/`dirname $fn`
                cp $fn $2/`dirname $fn`
            fi
        fi
    done
fi

答え3

yこの場合、[次へ]を押さないようにするには、前のEnter行(ターミナル設定のCtrl++)+改行文字Shiftを一度コピーし、メッセージが表示されたら(++)を貼り付けます。CyCtrlShiftV

ボタンではなく一度に押すことができるボタンであり、私にとってはそれだけで十分だ。次のプロンプトを待っている間に+を押し続けることができますCtrlShift

答え4

Slyx呼び出しに基づくread単純な1行コードは次のとおりです。

{ while read -r -n1 i; do echo >&2; echo $i; done } | cp -iar …

Ctrlループを終了するには、最後に+を押す必要があります。Dこれまで、コマンドが完了した後にループを終了する魔法の方法が見つかりませんでした。トラップがSIGCHLD望む方法で動作しないようです。 path という名前のファイルに保存すると、yesorno次のように書くことができます。

#!/bin/bash
{ while read -r -n1 i; do echo >&2; echo $i; done } | "$@"

あるいは、これを関数として定義できます~/.bash_profile

yesorno() {
  { while read -r -n1 i; do echo >&2; echo $i; done } | "$@"
}

どちらの場合も、次のように呼び出すことができます。

yesorno cp -iar …

関連情報