正規表現を使用せずにcp / mvを使用して複数のファイルをコピー/移動する


9

いくつかのファイルといくつかのフォルダーを含むフォルダーがあるとします(ファイルはどのタイプでもかまいません)。そして、それらのファイルやフォルダの一部をmv/ cpコマンドを使用して移動/コピーしたいと思います。Ctrlキーを使用して選択し、ターミナルを使用して移動/コピーを行うのと同じように、それらのいくつかをランダムに選択できる方法はありますか?異なるタイプのファイルを選択したいので、ワイルドカードも正規表現も使用できません。それらの名前には類似性が少しあります。


3
さらに情報を提供したい場合があります。どのような類似性ファイルがありますか?
Sergiy Kolodyazhnyy

2
正規表現やワイルドカードを使用できない場合でも、類似性と中括弧を利用して引数を拡張できます。とにかくbashでは、file1、file2、file3がある場合は、以下の回答のいずれかで、cp -t /dest/ file{1,2,3}またはrange forを使用できますcp -t /dest/ file{1..3}。それは例えば、あまりにも非数値引数との組み合わせで動作しcp -t /dest/ f{ile,ly}.{csv,txt}実行cp -t /dest/ file.txt file.csv fly.txt fly.csv。位置が重要な場合は上書きに注意してください。しかし、私はそれらが役に立つと思います。
neocpp

なぜこれが必要なのですか?あなたが説明するようにファイルマネージャーを使用しないのはなぜですか?シェルツールは、できるだけあいまいさを少なくしようとします。
Braiam

Ctrlキーを使用して、フォルダーの下のランダムなファイルとフォルダーを選択できることは誰もが知っています。Linuxターミナルを使用しているときに同様の手法を実装できるかどうかを知りたいだけです
MikhilMC

回答:


11

すべてのファイルを同じディレクトリに移動またはコピーする-t場合は、cpまたはのオプションを使用できますmvが、これは、各ファイル名を引数として入力または指定する必要があることを意味します。これは次のように機能し、必要な数のファイルを引数として使用します。

cp -t /destination/directory/ file1 file2 file3

または

mv -t /destination/directory/ file1 file2 file3

これはかなり面倒ですが、Bashのタブ補完を使用すると、ファイル名の入力が簡単になります

または、次のbashスクリプトは、最初の引数として指定されたディレクトリ内のすべてのファイルを検索し、2番目の引数として指定された宛先ディレクトリに選択したファイルをコピーします。

各ファイルをチェックし、そのファイルをコピーするかどうかを尋ねます。ファイル選択の最後に、選択したファイルのリストが表示され、それらを宛先ディレクトリーにコピーするかどうか尋ねられます。

#!/bin/bash
directory=$1
destination=$2
selected_files=()
for f in ${directory}/*
do
  if [[ -f $f ]]
  then
    while true
    do
      read -p "Would you like to copy ${f}? y/n: " choice
      case $choice in
        y|Y) selected_files+=("$f");
             break ;;
        n|N) echo "${f} will not be copied.";
             break ;;
        *) echo "Invalid choice, enter y/n: " ;;
      esac
    done
  fi
done
echo "The following files will be copied to ${destination}."
for file in "${selected_files[@]}"
do
  echo "$file"
done
while true
do
  read -p "Are these the correct files? y/n: " confirm
  case $confirm in
    y|Y) break ;;
    n|N) echo "Exiting filechooser"; exit 1 ;;
    *) echo "Invalid choice, enter y/n: " ;;
  esac
done
cp -t "$destination" "${selected_files[@]}"

このスクリプトには、宛先ディレクトリが存在するかどうか、または正しい引数を入力したかどうかに関するエラーチェックがないことに注意してください。


4

コピーするファイル/ディレクトリのランダムなセットを選択するスクリプトは次のとおりです。改行やスペースが含まれていても、任意のファイル名を処理できます。スクリプトをとして保存し、~/bin/randomCopy.sh実行可能(chmod a+x ~/bin/randomCopy.sh)にして実行します。最初の引数としてソースディレクトリ、2番目の引数としてターゲットディレクトリ、ファイル/ディレクトリの数を指定します(スクリプトはファイルとディレクトリを区別しませんが、あなたが要求したとおり)コピーされます。たとえば、5つのランダムなファイルまたはディレクトリをから/fooにコピーするには/bar

randomCopy.sh /foo /bar 5

スクリプト:

#!/bin/bash

if [ $# -lt 3 ]; then
        cat<<EOF 
This script needs at least 3 arguments: the source directory, the
target directory and the number of files/dirs to be copied. For example:

    $0 /from /to 5

EOF
        exit
fi 

sourceDir="$1"
targetDir="$2"
number="$3"

## Collect all file and directory names. The globstar
## bash option lets ** match all files and directories
## recursively
shopt -s globstar
dirsAndFiles=( ** )

## Get $num random numbers from 0 until
## the number of files and dirs found. This
## will let us take a random selection.
limit=$((${#dirsAndFiles[@]}-1))  
numbers=$(shuf -i 0-"$limit" -n "$number")

for num in $numbers; do
    cp -rv "${dirsAndFiles[$num]}" "$targetDir"
done

ターゲットディレクトリに同じファイル名のファイルが存在する場合、既存のファイルが上書きされることに注意してください。


0

たぶん、ミッドナイトコマンダーのようなものを使ってみてください。これは、グラフィカルなNautilusファイルマネージャと同様の機能を提供するコンソールアプリケーションです。


0

最近、xargsを使用してこの問題の効果的な解決策を見つけました。

`xargs cp
 file1
 file2
 .....
 .....
 <path of the destination folder>`

次にと入力しCtrl + Cます。これは確かに機能します。私はそれをテストしました。この方法Ctrlで、グラフィックモードでボタンを使用するのと同じようにファイルを選択し、コピー/移動/削除を行うことができます。

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