我正在尝试使用 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_files
this 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 .