使用父目录基本名称在 for 循环中创建新目录

使用父目录基本名称在 for 循环中创建新目录

我正在尝试使用 for 循环将文件(例如 .txt)移动到新目录中,其中原始目录名称作为名称的一部分,但在名称上添加额外的“with-new-files”,所以我知道该目录是新的及其包含的内容。

由于我在父目录中有大约 10 个包含 .txt 文件的目录,因此我理想情况下希望使用 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: No such file or directory mkdir: 2_SpecialDirectoryNameB: No such file or directory

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

米歇尔,您的for循环正在填充dir目录名称包括尾部斜杠。您可以通过替换${dir}为来即时修剪它们${dir%%/};表示%%您要排除变量末尾的模式。 (请注意,您实际上并没有更改变量内容本身,只是在代码的该点中替换了它。)

您的脚本还有另一个问题:您的for循环还将迭代您在第一行中创建的新目录(“New-directories-with-files”)。也许for dir in */您可以使用for dir in *_*/,假设您的目录名称遵循示例中的模式。另一种选择是将“New-directories-with-files”放置在父目录中。

答案2

我所看到的问题是,您匹配目录名称(包括尾部斜杠)的方式,因此$dir将包含1_SpecialDirectoryNameA/并将mkdir ${dir}_with_new_files解析为mkdir 1_SpecialDirectoryNameA/_with_new_files并且mkdir没有该-p标志将不会创建父文件夹,因此这就是错误的来源。

避免这种情况的一种方法是使用${dir%/}_with_new_filesthis is shell 参数扩展,类似于使用的 int这个答案

我看到的另一个问题是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 .

相关内容