私はmacOSを使用しており、Bashで次のコマンドを実行しようとしています。
cd root || exit
shopt -s dotglob
for d in ./*
do
if [ -d "$d" ]
then
find "$d" -type f -exec mv -i -t "$d" {} +
find "$d" -mindepth 1 -type d -delete
fi
done
macOSのコマンドは、フラグがディレクトリを指定することをmv
許可しておらず、-t
次のエラーを表示します。
mv: illegal option --t
usage: mv [-f | -i | -n] [-v] source target
macOSでこれを行うにはどうすればよいですか?
答え1
それ以外の場合は、-t
ターゲットディレクトリをオプションではなく最後の引数として残す必要がありますmv
。これには2つのオプションがあります。find
ターゲットディレクトリの前にファイル名を入れるか、mv
同じ操作を実行する他のものを見つけることです。したがって、次のいずれかを実行してください。
find "$d" -type f -exec mv -i {} "$d" \;
または:
export d; find "$d" -type f -exec sh -c 'exec mv -i "$@" "$d"' sh {} +
最初のコマンドは、mv
各ファイルに対して実行します。 2番目は、sh -c ...
ファイルのバッチに対して実行され、再びバッチ全体mv
に対して実行されます。 2番目のオプションはおそらくはるかに高速ですが、インタラクティブな検証を使用しているので、実際には重要ではありません。
答え2
バッシュとは何の関係もありません。これはmv
コマンドです。
mv
そのオプションを取得するには、gnuをインストールできます-t
。または、他の答えを確認しますが、いくつかの追加のアドバイスが必要です。
マニュアルページには両方のモードが表示されます(-t
モードを削除しました)。
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
指定せず-T
(Gnu mvでのみ可能だと思う)、2つの引数がある場合、構文があいまいであることがわかります。最後のファイルを確認すると、あいまいさを解決できます。ディレクトリの場合は2番目の形式、それ以外の場合は1番目の形式です。/
ディレクトリ名を追加し、2番目の形式を適用して構文を明示的に作成できます。これにより、多くのエラーを回避できます。残念ながら、最初の形式を明確にする唯一の方法は-T
。