web-dev-qa-db-ja.com

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

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

8
MikhilMC

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

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[@]}"

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

10
Arronical

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

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

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

4
terdon

多分 Midnight Commander ?これは、グラフィカルなNautilus File Managerと同様の機能を提供するコンソールアプリケーションです。

0
Tom

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

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

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

0
MikhilMC