親ディレクトリ basename を使用して for ループに新しいディレクトリを作成する

親ディレクトリ basename を使用して for ループに新しいディレクトリを作成する

forループを使用してファイル(例:.txt)を名前の一部として元のディレクトリ名を使用する新しいディレクトリに移動しようとしていますが、名前に追加する「with-new-files」を追加すると、ディレクトリは新しいものになります。コンテンツです。

親ディレクトリには.txtファイルを含む約10のディレクトリがあるため、手動で新しいディレクトリを作成してファイルを移動する代わりにforループを使用するのが理想的です。

たとえば、次のようなものがあります。

1_SpecialDirectoryNameA
    - fileA1.txt
    - fileA2.txt
    - unrelated_directory_A

2_SpecialDirectoryNameB
    - fileB1.txt
    - fileB2.txt
    - unrelated_directory_B

私が望むもの:

1_SpecialDirectoryNameA
    - unrelated_directory_A

2_SpecialDirectoryNameB
    - unrelated_directory_B

New-directories-with-files
    - 1_SpecialDirectoryNameA_with_new_files
         - fileA1.txt
         - fileA2.txt
    - 2_SpecialDirectoryNameB_with_new_files
        - fileB1.txt
        - fileB2.txt

次のコードを試しましたが、mkdir フェーズで停止すると、次のメッセージが表示されます。 mkdir: 1_SpecialDirectoryNameA: そのファイルまたはディレクトリがありません

mkdir New-directories-with-files

for dir in */   
do
    cd $dir
    mkdir "${dir}_with_new_files"
    mv *.txt "${dir}_with_new_files"
    mv "${dir}_with_new_files" ../New-directories-with-files/
    cd ../
done

これまで私が成功した唯一のケースは次のとおりです。

for dir in */   
do
    cd $dir
    mkdir newfolder_files
    cd ../
done

このコードを使用すると、.txtファイルを新しい "newfolder_files"ディレクトリに正常に移動できますが、すべての新しいディレクトリを一緒に移動するには、まず名前を1_newfolder_filesに手動で変更する必要があります。

${dir}ビットを使用して親ディレクトリ名を追加する方法がわかりません。

どんなアドバイスも本当にありがとうございます。ありがとうございます!

答え1

Michelle、ループがディレクトリ名をfor入力していますdir末尾のスラッシュを含む。変数の末尾からパターンを除外したいことを示します。に変更して${dir}すぐに切り取ることができます。 (変数の内容自体を実際に変更するのではなく、コード内のその点で置き換えるだけです。)${dir%%/}%%

スクリプトには別の問題があります。forループは、最初の行で作成された新しいディレクトリ(「New-directories-with-files」)に対しても繰り返されます。ディレクトリ名が例のパターンに従うと仮定すると、をfor dir in */使用できます。for dir in *_*/別のオプションは、「ファイル付きの新しいディレクトリ」を親ディレクトリに配置することです。

答え2

$dir私が見る問題は、含めるディレクトリ名(末尾のスラッシュを含む)を一致させる方法が解析され、対応する1_SpecialDirectoryNameA/フラグがないと親フォルダが生成されないため、エラーが発生することです。mkdir ${dir}_with_new_filesmkdir 1_SpecialDirectoryNameA/_with_new_filesmkdir-p

${dir%/}_with_new_filesこれを防ぐ1つの方法は、intを使用するのと同様のシェルパラメータ拡張を使用することです。この回答

私が見たもう1つの問題は、for dir in */スクリプトの一部が新しく作成されたディレクトリとも一致するため、安全な場所(親フォルダなど)に作成する方が良いことです。

したがって、スクリプトの可能な修正バージョンは次のとおりです。

mkdir ../New-directories-with-files

for dir in */
do
    cd $dir
    mkdir "${dir%/}_with_new_files"
    mv *.txt "${dir%/}_with_new_files"
    mv "${dir%/}_with_new_files" ../../New-directories-with-files/
    cd ../
done

mv ../New-directories-with-files .

関連情報