いくつかのファイルといくつかのフォルダーを含むフォルダーがあると仮定します(ファイルはどのタイプでもかまいません)。そして、mv
/cp
コマンドを使用して、これらのファイルとフォルダーの一部を移動/コピーしたいと思います。 Ctrlキーを使用して選択を行い、ターミナルを使用して移動/コピーするのと同じように、ランダムに選択できる方法はありますか?さまざまな種類のファイルを選択したいので、ワイルドカードも正規表現も使用できません。それらの名前にはわずかな類似性があります。
すべてのファイルを同じディレクトリに移動またはコピーする場合は、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[@]}"
このスクリプトでは、宛先ディレクトリが存在するかどうかについてエラーチェックを行っていないこと、または正しい引数を入力したことに注意してください。
コピーするファイル/ディレクトリのランダムなセットを選択するスクリプトを次に示します。改行やスペースを含むものであっても、任意のファイル名を処理できます。スクリプトを~/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
ターゲットディレクトリに同じファイル名のファイルが存在する場合、既存のファイルが上書きされることに注意してください。
多分 Midnight Commander ?これは、グラフィカルなNautilus File Managerと同様の機能を提供するコンソールアプリケーションです。
最近、xargsを使用してこの問題の効果的な解決策を見つけました。
`xargs cp
file1
file2
.....
.....
<path of the destination folder>`
次にCtrl + C
と入力します。これは確実に機能します。私はそれをテストしました。この方法により、グラフィックモードでCtrl
ボタンを使用するのと同じようにファイルを選択し、コピー/移動/削除を行うことができます。