親ディレクトリ 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 *_*/別のオプションは、「ファイル付きの新しいディレクトリ」を親ディレクトリに配置することです。

おすすめ記事