次のフォルダ構造があります。
/Folder1/Folder2/output/0653/3547/0112945601/
/Folder1/Folder2/output/0653/3547/0112945602/
5番目のサブフォルダのみが変更されました。
5番目のサブフォルダをすべて一覧表示し、次のように再構成したいと思います。
/Folder1/Folder2/output01/0653/3547/0112945601/
/Folder1/Folder2/output02/0653/3547/0112945602/
/Folder1/Folder2/output03/0653/3547/0112945603/
...
/Folder1/Folder2/output<nn>/0653/3547/01129456<nn>/
10個のサブフォルダがある場合、このロジックによれば10個の出力フォルダが必要です。
使ってみよう
find -maxdepth 5 -type d
whileループに入れましたが、5番目のサブフォルダだけを処理することはできません。
私は何ができると思いますか?
答え1
for dir in Folder1/Folder2/output/*/*/*; do
suffix=${dir:(-2)}
subdir="$(cut -d '/' -f 4- <<<$dir)"
newdir="Folder1/Folder2/output${suffix}/${subdir}"
echo mkdir -p "$newdir"
echo mv "$dir"/* "$newdir"/
done
練習を実行した後に自分に合ったコマンドを生成するように見える場合は、ドアを削除してecho
実際にファイルを移動してください。
答え2
現在のディレクトリにあるとしますFolder1
。
#!/bin/bash
# Don't even attempt to do something
# if we're in the wrong place.
cd Folder1/Folder2 || exit 1
# Make the shell remove patterns that aren't matched,
# rather than leaving them as they are.
shopt -s nullglob
for dirpath in output/*/*/*/; do
if [[ $dirpath =~ output/(.*)/[^/]*(..)/ ]]; then
# "${BASH_REMATCH[1]}" is something like "0653/3457"
# "${BASH_REMATCH[2]}" is the 2-character suffix, like "01"
newdir=output${BASH_REMATCH[2]}/${BASH_REMATCH[1]}
mkdir -p "$newdir" &&
mv "$dirpath" "$newdir"
fi
done
これは、正規表現の一致を使用してbash
ディレクトリパス名の末尾から数字のサフィックスを選択し、output
それを使用して新しいディレクトリ名を設定します。
これはディレクトリ構造をとる
.
`-- Folder1/
`-- Folder2/
`-- output/
`-- 0653/
`-- 3547/
|-- 0112945601/
`-- 0112945602/
そしてそれを
.
`-- Folder1/
`-- Folder2/
|-- output/
| `-- 0653/
| `-- 3547/
|-- output01/
| `-- 0653/
| `-- 3547/
| `-- 0112945601/
`-- output02/
`-- 0653/
`-- 3547/
`-- 0112945602/
Folder1/Folder2/output
その後、次のように空のディレクトリを削除できます。
find Folder1/Folder2/output -type d -empty -delete
find
または、空でないディレクトリを削除しようとするときは、標準を使用してエラーを無視してください。rmdir
find Folder1/Folder2/output -depth -type d -exec rmdir {} \; 2>/dev/null
これは去る
.
`-- Folder1/
`-- Folder2/
|-- output01/
| `-- 0653/
| `-- 3547/
| `-- 0112945601/
`-- output02/
`-- 0653/
`-- 3547/
`-- 0112945602/
確かにそこにいるんだコピーまずあなたのデータです。
答え3
#!/usr/bin/env bash
PATH="/folder1/folder2/folder3"
HIERARQUIA=$(/usr/bin/find $PATH/????/????/ -maxdepth 0 -type d | /usr/bin/cut -d "/" -f5-|/usr/bin/sort -s )
OUTPUT=1
for i in $HIERARQUIA
do
SUBPASTAS=$(/usr/bin/find $PATH/$i -maxdepth 1 -type d | /usr/bin/cut -d "/" -f7 |/usr/bin/sort -s)
for a in $SUBPASTAS
do
/usr/bin/mkdir -p $PATH/output$OUTPUT/$i$a
/usr/bin/mv $PATH/$i$a/* $PATH/output$OUTPUT/$i$a
OUTPUT=$(($OUTPUT +1))
done
OUTPUT=1
done
私はこの結果を見つけ、その目的に合致しました。いつか同様の問題が発生しているすべての人のためにここにコードがあります。
答えて助けてくれた皆さんに感謝します。