Unixコマンドを実行してファイルリストを繰り返す一般的な方法はありますか?たとえば、あるディレクトリ内のすべてのファイル(ディレクトリを除く)を別のディレクトリに移動し、各ファイルの前にy / nプロンプトを表示するとします。明らかにこれはスクリプトを介して実行できますが、mvだけでなくファイルに対する同様の操作(rm、cat、wc、grepなど)にも使用できるコマンド方法はありますか?
答え1
はい、
find /path/to/source/dir -type f -maxdepth 1 -ok mv {} /path/to/target/dir \;
ここのコマンドは、find
すべての一般ファイルを検索し、/path/to/source/dir
ユーザーに与えられたアクションを実行するように求めるメッセージを表示します。この場合、ファイルをに移動します/path/to/target/dir
。ユーザーがy
(およびenter)を押すと、操作が実行されます。
{}
は順番に見つかった各ファイルの名前に置き換えられ、各ファイルに対して実行されたコマンドは\;
。
-ok
に置き換えると、-exec
ユーザーにメッセージが表示されず、次のメッセージが表示されます。みんな文書。
-maxdepth 1
ファイル検索を最上位ディレクトリ(/path/to/source/dir
)に制限します。これがなければ、find
指定されたパスの下のすべてのサブディレクトリに再帰されます。
-type f
検索を通常のファイルに限定します(ディレクトリ、ソケット、デバイスファイルなどは検索しません)。
答え2
通常、シェルグローブを使用して作業するファイルのリストを生成し、読み取りとテストを実行して操作を実行するかどうかを決定します。
(あなたの)例えば:
for f in *
do
[ -f "$f" ] || continue
read -p "mv $f to /tmp? "
if [ $REPLY = "y" ]
then
echo "moving $f to /tmp"
# mv -- "$f" /tmp
else
echo "not doing anything with $f"
fi
done
シェルの設定によっては、ドットファイル(例)を選択したり選択したりしない場合があります.bashrc
。
必要に応じて変更できます。 「いいえ」と答えないでください。 「y」、「y」、「yes」、または「yabadabadoo」を許可します。