ファイルがディレクトリの場合は移動しないでくださいmv bash

ファイルがディレクトリの場合は移動しないでくださいmv bash

私はファイルを整理するのに役立つスクリプトを書いています。デフォルトでは、スクリプトは拡張子に従ってファイルを構成したいと思います。現在のソリューションは、特定のディレクトリのすべてを調べます。名前にドットがあるフォルダが移動されるため問題になります。

if statementディレクトリが物理ディレクトリであることを確認するために使用できる方法があるかどうか疑問に思います。実際にディレクトリの場合、スクリプトはディレクトリを移動しないでください。

コード部分です。私はfor loopファイルを繰り返すためにaを使用しています。これはWindowsにあった以前のバッチスクリプトに大まかに基づいているため、これが最善のアプローチではない可能性があります。より良い解決策があれば教えてください。

#!/bin/bash
for i in *.*; do
  filename=$(basename -- "$i")
  extension="${filename##*.}"
  extension="$extension"files
  mkdir -p "$extension"
  mv "$i" "$extension"
done

ベストアンサー1

個人的には、forディレクトリ/ファイルを使用してそれぞれファイル形式を指定できるfindため、aとループを使用します。while-type d/f

実行するディレクトリの「行」として:

find . -maxdepth 1 -type f -name "*.*" | while IFS="" read -r line; do filename=$(basename -- "$line"); extension="${filename##.}.files"; mkdir -p "$extension"; mv "$line" "$extension"; done

またはスクリプトから:

#!/bin/bash
find . -maxdepth 1 -type f -name "*.*" |
while IFS="" read -r line; do
    filename=$(basename -- "$line")
    extension="${filename##.}.files"
    mkdir -p "$extension"
    mv "$line" "$extension"
done

説明する

find .- 現在のディレクトリでファイルとディレクトリを探す

-maxdepth 1- 現在のディレクトリのみを確認します。 (2は次のレベルディレクトリも確認します。)

-type f- ファイルのみ一致

-name *.*- 名前に「.」を含むすべてのファイル

.files私もそれがあなたが望むものだと思うので、拡張を変数宣言に変更しました。現在スクリプトにあるようにtmp.txtディレクトリにあると言いたい場合は、次のように「.」を削除します。tmp.txtfiles

extension="${filename##.}files"

編集する:

したがって、@Kusalanandaが指摘したように、aを繰り返すのはfindおそらく悪い考えです。それにもかかわらず、findこの機能を引き続き使用できます。一時ファイルを使用して繰り返します。

#!/bin/bash
find . -maxdepth 1 -type f -name "*.*" > myTemporaryFile

IFS=$'\n' # in case any filenames have spaces in them

for line in $(cat myTemporaryFile); do
    filename=$(basename -- "$line")
    extension="${filename##.}.files"
    mkdir -p "$extension"
    mv "$line" "$extension"
done

rm myTemporaryFile

おすすめ記事