gpt4 book ai didi

Linux循环移动文件到它们的子目录

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:20 33 4
gpt4 key购买 nike

能否请您推荐一种有效的方法,将文件从一个位置循环移动到它们的子目录。

例如:

/MY_PATH/User1/1234/Daily/abc.txt/MY_PATH/User1/1234/Daily/Archive/abc.txt

/MY_PATH/User2/3456/Daily/def.txt/MY_PATH/User2/3456/Daily/Archive/def.txt

/MY_PATH/User1/1111/Daily/hij.txt/MY_PATH/User1/1111/Daily/Archive/hij.txt

/MY_PATH/User2/2222/Daily/def.txt/MY_PATH/User2/2222/Daily/Archive/def.txt

我是这样开始的,但是需要你的建议和最好的写法:

#!/bin/bash

dir1="/MyPath/"

subs= `ls $dir1`

for i in $subs; do
mv $dir1/$i/*/Daily $dir1/$i/*/Daily/Archive
done

最佳答案

我的一行 bash

for dir in $(
find MY_PATH -mindepth 3 -maxdepth 3 -type d -name Daily
);do
mkdir -p $dir/Archives
find $dir -maxdepth 1 -mindepth 1 ! -name Archives \
-exec mv -t $dir/Archives {} +
done

快速测试:

mkdir -p MY_PATH/User{1,2,3,4}/{1234,2346,3333,2323}/Daily 
touch MY_PATH/User{1,2,3,4}/{1234,2346,3333,2323}/Daily/{abc,bcd,def,feg,fds}.txt
for dir in $( find MY_PATH -mindepth 3 -maxdepth 3 -type d -name Daily );do
mkdir -p $dir/Archives; find $dir -maxdepth 1 -mindepth 1 ! -name Archives \
-exec mv -t $dir/Archives {} + ; done
ls -lR MY_PATH

这似乎符合OP的要求

更强大的解决方案

有一个解决方案可以在路径中某处使用空格...

编辑以包含@mklement0 的中肯建议。

while IFS= read dir;do
mkdir -p "$dir"/Archives
find "$dir" -maxdepth 1 -mindepth 1 ! -name Archives \
-exec mv -t "$dir/Archives" {} +
done < <(
find MY_PATH -mindepth 3 -maxdepth 3 -type d -name Daily
)

相同的演示;

mkdir -p MY_PATH/User{1,2,3,"4 3"}/{1234,"23 6",3333,2323}/Daily
touch MY_PATH/User{1,2,3,"4 3"}/{1234,"23 6",3333,2323}/Daily/{abc,"b c",def,hgz0}.txt
while read dir;do mkdir -p "$dir"/Archives;find "$dir" -maxdepth 1 -mindepth 1 \
! -name Archives -exec mv -t "$dir/Archives" {} +; done < <(
find MY_PATH -mindepth 3 -maxdepth 3 -type d -name Daily )
ls -lR MY_PATH

关于Linux循环移动文件到它们的子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29573358/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com