ディレクトリ階層の名前を変更するには?
たとえば、フォルダが2つしかなく、名前を変更したいc/d
とします。x/y
したがって、操作後は/a/b/c/d/e
完全なディレクトリパスになります。/a/b/x/y/e
純粋なbashで実装する方法がわかりません。 (これらのbashスクリプトを作成すると、手動で名前を変更するよりも時間がかかると仮定します。そのようなディレクトリは約200個あります。)
たぶんこの目的のためのユーティリティがありますか?
答え1
組み合わせを使用するとmkdir -p
簡単にmv
できます。難しい部分(シェルのように)は、シェルで誤って解釈される可能性がある安全な方法で特殊記号の名前を提供することです。
パスに\t
andを含めることができないことを保証できるとします\n
(通常、Linux / Unixシステムではそうではありません)。その後、タブで区切られたフィールドのリストを名前変更ツールに提供できます。
# Prepare paths
cat > names.txt <<"HERE" # TAB separated
a/b/c/d/file1 a/b/x/y/file1
a/white space/file2 a/c/z/while space/file2
a/fancy$name/file2 a/c/z/so what?/file2
HERE
# Do the renaming
while IFS=$'\t' read -r IN OUT; do
printf 'Renaming [%s]->[%s]\n' "$IN" "$OUT"
mkdir -p "${OUT%/*}"
mv "$IN" "$OUT"
done < names.txt
注:もちろん、他のものをnames.txt
使用する代わりに、必要なテキストエディタを使用してファイルを準備できます。cat
here document
注2:"${OUT%/*}"
構文(「一致するサフィックスパターンの削除」)はbashにのみ適用されます。
注3:以前のディレクトリは削除されず、同様のコマンドを実行してfind -depth -type d -empty -print -exec rmdir {} \;
削除できます。