1

私が制御を継承した従来の Web アプリケーションは、Web サーバー上のフォルダー内のサブディレクトリの最大数に達したようです。システムで記事が作成されるたびに、その静的コンテンツがパターンに一致するドキュメント ルートのサブディレクトリに配置されます/uploads/story/{STORY_ID}//uploads/story/しかし、現在、システムはフォルダーに新しいディレクトリを作成できません。

これを 2 つのステップで解決したいのですが、これを達成するために必要な Linux コマンドを実行する方法がわかりません。お手伝いいただけませんか?

  1. より良いディレクトリ構造を実装する時間を稼ぐための一時的な修正として、STORY_ID が 1000 未満のすべての記事の静的コンテンツをアーカイブしたいと考えています。これらは から/uploads/story/に移動する必要があります/uploads/story_archive/

  2. アップロード パスをコード内に変更しますが、すべてのフォルダーをこの形式/uploads/story/{THOUSANDS}/{STORY_ID}/に移動できるようにする必要があります。/uploads/story/など/uploads/story/65312/となり/uploads/story/65/65312/ます。これどうやってするの?

編集

(1) の修正は、実行するのと同じくらい簡単でした。

$ cd /path/to/uploads/
$ mkdir story_archive
$ for i in {1..999}; do mv story/$i story_archive/; done
4

2 に答える 2

1

/uploads/story/*その部分に数字が表示されると確信している場合は*、次のことができます (注: 念のため全体をバックアップしてください)。

# update this based on your actual directory
path_to_fix=/uploads/stories

# move the directories out of the way so they don't get mixed up
mv $path_to_fix $path_to_fix/../temp
mkdir $path_to_fix > /dev/null 2>&1

# get all directories to be moved
dirs=$(ls $path_to_fix/../temp)

# for each of them
for d in $dirs; do
  # get the basename, which is store_id
  id=$(basename $d)
  # divide by 1000
  sub=$((id / 1000))
  # create the appropriate directory
  mkdir $path_to_fix/$sub > /dev/null 2>&1
  # move the original directory to that sub-directory
  mv $path_to_fix/../temp/$d $path_to_fix/$sub
done

# cleanup
rm -Rf $path_to_fix/../temp
于 2013-01-16T09:59:01.763 に答える
1

ループとグロブに使用できる一時的な修正のために

for path in /uploads/story/*; do
   storyid=${path##*/}
   if [[ ${storyid} -lt 1000 ]]; then
        mv "${path}" /uploads/story_archive/${storyid}
   fi
done

/uploads/story/ ディレクトリ内のすべてのディレクトリに対して、$path var. bash コンストラクト ${variable##pattern} は、variable の左側からパターンに一致する最長の部分文字列を削除します。この場合、すべての主要なディレクトリが、storyid だけを残して var に格納されます。次に、ストーリー ID が 1000 未満かどうかを確認し、ストーリー アーカイブに移動します。

次のビット。

for path in /uploads/story/*; do
   storyid=${path##*/}
   if [[ $storyid -ge 1000 ]]; then
       thous=${storyid%%???}
       [[ -d/uploads/story/$thous/ ]] || mkdir /uploads/story/$thous/
       mv $path /uploads/story/$thous/
   fi
done

ここでも、すべてのディレクトリを繰り返し処理し、ストーリー ID を取り出します。今回は、storyid が 1000 以上であることを確認し、%%??? を使用します。storyid から最後の 3 文字を削除します (## トリックと同じですが、変数の右側からです。) 次に、数千のディレクトリが存在するかどうかを確認し、存在しない場合はそれを作成し、ディレクトリを移動します。

1 つのスイープを実行して、両方のタスクを同時に実行することもできます

for path in /uploads/story/*; do
   storyid=${path##*/}
   if [[ $storyid -lt 1000 ]]; then
       mv "${path}" /uploads/story_archive/${storyid}
   else
       thous=${storyid%%???}
       [[ -d/uploads/story/$thous/ ]] || mkdir /uploads/story/$thous/
       mv $path /uploads/story/$thous/
   fi
done
于 2013-01-16T10:05:40.160 に答える