Linuxのみのファイルの移動

Linuxのみのファイルの移動

パス /participant/data があり、すべてのファイルはデータ ディレクトリにあります。ただし、ディレクトリ構造は /participant/data/subdirectory にして、サブディレクトリにすべてのファイルを含めます。パイプラインを渡すには、このようになっている必要があります。

私の最初の考えは

mkdir /参加者/データ/サブディレクトリ/

mv /participant/data/*.* /participant/data/サブディレクトリ/

ただし、ファイルにはファイル拡張子がないため、*.* を使用しても機能しません。これを行う方法について何か提案はありますか?

答え1

すべてを移動するだけです:

mv /participant/data/* /participant/data/subdirectory/

これにより、それ自体に移動できないというエラーが表示されますsubdirectoryが、他のすべてのものは希望どおりにそのサブディレクトリに移動します。

Bashでは、次のようなshopt -s extglobワイルドカード文字が追加され、!(xy|z)* を除外する xyまたはz

shopt -s extglob
mv /participant/data/!(subdir) /participant/data/subdir/

(Zsh には、ファイルのみに一致できるさらに拡張されたワイルドカードがある可能性があります。)

サブディレクトリがさらにあり、それらに触れたくない場合は、findやなどのツールfdを使用して、特定の項目のみ、この場合はファイルのみを操作できます。

find /participant/data -maxdepth 1 -type f -exec mv {} /participant/data/subdir/ \;

mv -tおよびを使用すると、少しだけ効率が上がります-exec +

find /participant/data -maxdepth 1 -type f -exec mv -t /participant/data/subdir {} +

前の (遅い) 例は、シェルforループとして記述することもできます。

for x in /participant/data/*; do
    if [[ -f $x ]]; then mv "$x" /participant/data/subdirectory/; fi
done

答え2

ファイル名に関係なくすべてのファイルを含めるには、*の代わりにを使用できます。*.*

ただし、これにはディレクトリも含まれるためsubdirectory、ファイルを移動するときにそれを除外する必要があります。

これは拡張パターン マッチング関数で可能です。まず、これらを有効にする必要があります (現在のセッションに対して):

$ shopt -s extglob

次に、1つを除くすべてのファイルを次のように指定します。path/!(excludedFile)

実装mv

$ mv /participant/data/!(subdirectory) /participant/data/subdirectory/

1 つを除くすべてのファイルを移動するためのオプションが他にもあります。https://www.baeldung.com/linux/move-all-files-except-one

答え3

あなたが説明した状況で最も簡単なのは次のことです。

cd /participant/data
mkdir .tempname
mv * .tmpname
mv .tmpname subdirectory

* は、非表示ではないすべてのディレクトリ エントリ、つまりドットで始まらないすべてのディレクトリ エントリと一致します。サブディレクトリ名を一時的にドットで開始したため、一致せず、データ内のすべてのエントリが移動されます。他のサブディレクトリなど、移動したくないエントリがある場合は、user1686 の詳細な回答にあるような、より複雑な方法のいずれかを使用する必要があります。

関連情報