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_files
mkdir 1_SpecialDirectoryNameA/_with_new_files
mkdir
-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 .