私は次の課題を実行しており、私のプログラムに関する質問があります。
以下の説明に従ってファイルをコピーするシェルスクリプトを作成します。サフィックスはコマンドライン引数として送信する必要があります。指定されたサフィックスが適切な現在のディレクトリ内の各ファイルについて、ユーザーにそのファイルを保存する必要があるかどうかを尋ねるメッセージが表示されます。答えが「はい」の場合は、ファイルをバックアップディレクトリにコピーする必要があります。ディレクトリが存在しない場合は、新規作成する必要があります。
これが私がしたことです:
#!/bin/sh
usage() {
echo "Usage : prog.sh <POSTFIX> " >&2
exit 1
}
if [ $# -ne 1 ]; then
usage
fi
list=$(ls)
for name in $list; do
case $name in
*.$@)
printf "Do you want to save the file ?\n"
read answer
case $answer in
Yes|yes|y)
ls backup 2>/dev/null || mkdir backup
mv $name backup
;;
No|no|n);;
esac ;;
esac
done
次のフォルダがあるとしましょう。 (バックアップディレクトリに移動します。)
bar.txt foobar.txt foo.txt mbar.txt
これは私の結果です。
Do you want to save the file ?
y
Do you want to save the file ?
y
bar.txt // Why is it printing the file during the output ?
Do you want to save the file ?
y
bar.txt foobar.txt // ??
Do you want to save the file ?
y
bar.txt foobar.txt foo.txt // ??
ls backup 2>/dev/null || mkdir backup
(代わりに)このように書くことができることを知っています
if [ ! -d backup ] ; then
mkdir backup
fi
しかし、私のプログラムが出力中にバックアップに移動したファイルを印刷する理由を知りたいです。
ベストアンサー1
ls backup 2>/dev/null
ディレクトリに移動した各ファイルに対して操作を実行したため、そのファイルはbackup
次にls
表示されます。
ただし、スクリプト全体を次の単一のコマンドに置き換えることができますrsync
。
rsync --include='*.{txt,csv,xyz}' /path/to/source/* /path/to/backup/
バラよりman rsync
同期後に削除する方法の詳細をご覧ください。