web-dev-qa-db-ja.com

ファイル名とディレクトリ名の交換

./date-and-time/fixed/path/filenameにファイルのコレクションがあり、date-and-timefilenameは可変です。これらすべてのファイルを./filename/date-and-timeに移動したいと思います。前のパスはファイル名で、前のファイル名はパスです。これを行う良い方法はありますか?合計で〜1000個のファイルがあり、〜100個の異なるファイル名があります。

2
Charles

このような何かが動作するはずです(実際のコマンドをechoedしていることに注意してください;それらを削除する前にそれが正しいことをしていることを注意深く確認してください)

#!/bin/bash

shopt -s nullglob

for file in */fixed/path/*; do 
  [[ -f "$file" ]] || continue
  f="${file##*/}"; d="${file%%/*}"
  echo mkdir -p "$f" && echo mv --no-clobber -- "$file" "$f/$d"
done
4
steeldriver

パスのパターンは常に./date-and-time/fixed/path/filenameで、変数date-and-timefilenameであると仮定します。

date-and-timeawkで抽出できます:

$ echo './date-and-time/fixed/path/filename' |awk -F "/" '{print $2}'
date-and-time

filenamebasenameで抽出できるため、取得が少し簡単です。

$ basename ./date-and-time/fixed/path/filename
filename

これらの2つのコードセグメントから、.で実行されたときに記述した方法でファイルを移動するためのテストされていないスクリプトが続きます。使用前に確認してください。

#!/bin/bash

for i in ./*/fixed/path/*; do
    date_and_time=$(echo "$i" |awk -F "/" '{print $2}');
    filename=$(basename "$i");
    mkdir "$filename";
    mv "$i" "$filename"/"$date_and_time";
done;
2
dsstorefile1

このような :

mkdir ./filename/ && mv ./date-and-time/path/to/path-to-your-folder/* ./filename/date-and-time

編集

さらにフォルダを作成する必要がある場合は、次のようなスクリプトを作成することをお勧めします。

開始する前に、これを実行しようとしているフォルダーのバックアップを作成することをお勧めします。

操作しようとしているフォルダーにcdしてから、次の操作を行います。

for file in *; do
  if [[ -f "$file" ]]; then
    mkdir "${file%.*}"
    mv "$file" "${file%.*}"
  fi
done
  1. 現在のフォルダー内のすべてのファイル(*)をループします。
  2. 拡張子$ {file%。*}のないファイルからフォルダー(mkdir)を作成します
  3. ファイルをそのフォルダーに移動(mv)します。
0
An0n