2017-03-13 3 views
1

ディレクトリには、何千ものファイルがあります。数千のファイルを別々のフォルダに置くためのbashスクリプト

が、私はこれらのファイルの何千ものを作るために、次のbashスニペットを使用し、

、それぞれ1000個のファイルを持っている、フォルダに入れて、私は2つの問題に直面する:

a)は、今、各フォルダを接頭辞はdir_ですが、6桁の名前が必要ですが、フォルダ名に6未満の場合は、先頭のゼロを適切に追加する必要があります。

b)現在のスクリプト、最後のフォルダに最初のフォルダを入れます。たとえば、最後のフォルダとしてdir_400325があります。そこには、実行したbashスクリプトとdir_1000フォルダがあります。最初のフォルダが作成されます。どのように私はこれを変更することができますので、最初のフォルダは、最後のものに格納されていません?

#/ binに/ bashの

c=0; d=1000; mkdir -p dir_${d} 

for file in * 
do 
     if [ $c -eq 1000 ] 
     then 
       d=$((d + 1000)); c=0; mkdir -p dir_${d} 
     fi 
     mv "$file" dir_${d}/ 
     c=$((c + 1)) 
done 

答えて

1

あなたがprintfとシェルで実証先行ゼロ(%06d)を使用して6桁のディレクトリ名を生成するためのフォーマット文字列、使用することができます!

bash-4.4$ d=1001 
bash-4.4$ dir_name=$(printf "/path/to/%06d" $d) 
bash-4.4$ echo $dir_name 
/path/to/001001 

絶対パスを使用すると、ファイルが現在の作業ディレクトリの一部のサブフォルダではなく、予想されるところに確実に置かれます。

#!/bin/bash 

c=0 
d=1000 
dir_name=$(printf "/path/to/%06d" $d) 
mkdir -p $dir_name 

for file in * 
do 
    if [ $c -eq 1000 ] 
    then 
     c=0 
     d=$((d + 1000)) 
     dir_name=$(printf "/path/to/%06d" $d) 
     mkdir -p $dir_name 
    fi 
    if [[ -f "$file" ]] 
    then 
     mv "$file" $dir_name 
     c=$((c + 1)) 
    fi 
done 
+0

それは動作しますが、私は次の警告を取得しますなぜ私は理解していない、とどのように私はそれを排除することができます。mv:「を、自身のサブディレクトリに「001000」を移動することはできません/パス/に/ 001000/001000 ' – dessie

+0

'001000'はグロブ' * 'とマッチします。私の編集のように非ファイル( '[-f" $ file "]]でディレクトリをスキップすることもできます。 – Johnsyweb

関連する問題