多くのサブディレクトリを含むディレクトリがあります。これらのサブディレクトリには、それぞれ一意の名前を持つファイルが含まれています。すべてのサブディレクトリのすべてのファイルをインポートし、すべて1つのディレクトリに移動したいと思います。
何百ものサブディレクトリがあるため、これを手動で実行したくありません。そのためにシェルスクリプトをどのように書くのですか?バッシュを使っています。
答え1
find
解決策は次のとおりです。
find /srcpath -type f -exec mv {} /dstpath \;
または、より良い方法は次のmv
とおりです-t destination-dir
。
find /srcpath -type f -exec mv -t /dstpath {} +
答え2
単一レベルのサブディレクトリがある場合、簡単な方法は次のとおりです。
cd source_directory
mv -- */* /path/to/target/directory
ファイルを親ディレクトリ、つまりに移動したい場合は、名前(「ドットファイル」)で始まるファイルまたはディレクトリは除外されますmv -- */* .
。.
Bashに含めるには、まず実行してくださいshopt -s dotglob
。 zshでsetopt glob_dots
最初に実行します。
子サブディレクトリなどからファイルを再帰的に移動するには、次のようにしますzsh
。
cd source_directory
mv -- */**/*(^/) .
コマンドを実行しようとしたときにmv
「コマンドラインが長すぎます」などのエラーが発生した場合は、それを分析する必要があります。最も簡単な方法は、find
GNUツール(組み込みのLinuxおよびCygwin)を使用することです。
find source_directory -mindepth 2 ! -type d \
-exec mv -t /path/to/target/directory -- {} +
答え3
#! /bin/sh
# set your output directory here
outdir=./Outdir
# get a list of all the files (-type f)
# in subdirectories (-mindepth 1)
# who do not match the outdir (-path $outdir -prune)
# and step through and execute a move
find . -mindepth 1 -path $outdir -prune -o -type f -exec mv '{}' $outdir \;
これにより、現在の作業ディレクトリ、すべてのサブディレクトリから検索し、同じ作業ディレクトリ($ outdir)のサブディレクトリにファイルを移動できます。正しく機能するには、-pruneパスに./が必要です。