サブディレクトリを圧縮する方法

サブディレクトリを圧縮する方法

多くのサブディレクトリを含むディレクトリがあります。これらのサブディレクトリには、それぞれ一意の名前を持つファイルが含まれています。すべてのサブディレクトリのすべてのファイルをインポートし、すべて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「コマンドラインが長すぎます」などのエラーが発生した場合は、それを分析する必要があります。最も簡単な方法は、findGNUツール(組み込みの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パスに./が必要です。

関連情報