我有一个目录列表,并希望通过创建一组文件夹然后使用通配符移动来移动每个目录中的文件。
到目前为止我所拥有的是:
for dir in $(ls -d */); do
mkdir "$dir/Summary_CSV"
mv "*SUMMARY-ABC.csv" $dir/Summary_CSV
done
目录创建正常(已验证)但我始终收到错误消息,指出文件不存在。
mv: rename SUBDIR1///*SUMMARY-ABC.csv to SUBDIR1///Summary_CSV/*SUMMARY-ABC.csv: No such file or directory
答案 0 :(得分:1)
而不是这一行:
mv "*SUMMARY-ABC.csv" $dir/Summary_CSV
尝试以下操作或根本不使用"
双引号:
mv "${dir}"/*SUMMARY-ABC.csv $dir/Summary_CSV
您成功创建了文件夹" Summary_CSV"在每个子目录(SUBDIR1 / 2/3等)下,但在复制时,你并没有从每个" sub"目录。
此外,用于捕获目录的for
循环命令应更改为:
for dir in $(ls -d */); do
要:
for dir in $(ls -l|grep ^d|sed "s/[ \t][ \t]*/ /g;s/\/$//"|cut -d' ' -f9|tr '\012' ' '); do
否则,您将获得符号链接到实际文件夹(这将导致"找不到文件,因为您已经从实际文件夹或符号链接(对于该文件夹)移动了文件,无论哪个是列出/选择第一个)。
完整解决方案:从任何文件夹中尝试:
giga@myLinuxMachine /tmp> rm -fr dir; mkdir dir; cd dir; mkdir sub-{dir1,dir2,dir3}; for d in `ls -1`; do touch $d/f{1,2,3} || true; done; find .;
./sub-dir1
./sub-dir1/f3
./sub-dir1/f2
./sub-dir1/f1
./sub-dir3
./sub-dir3/f3
./sub-dir3/f2
./sub-dir3/f1
./sub-dir2
./sub-dir2/f3
./sub-dir2/f2
./sub-dir2/f1
giga@myLinuxMachine /tmp/dir> : lets move files f1-3 to Summary_CSV folder inside each sub-dirN folder
giga@myLinuxMachine /tmp/dir>
giga@myLinuxMachine /tmp/dir> for dir in $(ls -l|grep ^d|sed "s/[ \t][ \t]*/ /g;s/\/$//"|cut -d' ' -f9|tr '\012' ' '); do echo "- Moving all sub-directory: ${dir}/f* files to "${dir}/Summary_CSV" folder"; mkdir ${dir}/Summary_CSV; mv ${dir}/*f* ${dir}/Summary_CSV; done; echo -e "\n\n\n- Lets see what we got after moving\n\n"; find .
- Moving all sub-directory: sub-dir1/f* files to sub-dir1/Summary_CSV folder
- Moving all sub-directory: sub-dir2/f* files to sub-dir2/Summary_CSV folder
- Moving all sub-directory: sub-dir3/f* files to sub-dir3/Summary_CSV folder
- Lets see what we got after moving
.
./sub-dir1
./sub-dir1/Summary_CSV
./sub-dir1/Summary_CSV/f3
./sub-dir1/Summary_CSV/f2
./sub-dir1/Summary_CSV/f1
./sub-dir3
./sub-dir3/Summary_CSV
./sub-dir3/Summary_CSV/f3
./sub-dir3/Summary_CSV/f2
./sub-dir3/Summary_CSV/f1
./sub-dir2
./sub-dir2/Summary_CSV
./sub-dir2/Summary_CSV/f3
./sub-dir2/Summary_CSV/f2
./sub-dir2/Summary_CSV/f1