(请参见底部的最小示例)
我有以下文件夹结构:
https://drive.google.com/open?id=1an6x1IRtNjOG6d9D5FlYwsUxmgaEegUY
每个文件夹在末尾显示:日期、月份和日期:
例如:
/HRIT/EPI/2004/01/14在里面的每一天,每个子文件夹包含大量的文件(总共约10 TB)。
所有可用的文件夹是:
/HRIT/EPI/YYYY/MM/DD/
/HRIT/HRV/YYYY/MM/DD/
/HRIT/VIS006/YYYY/MM/DD/
/HRIT/VIS008/YYYY/MM/DD/
/HRIT/WV_062/YYYY/MM/DD/
/HRIT/WV_073/YYYY/MM/DD/
/HRIT/IR_016/YYYY/MM/DD/
/HRIT/IR_039/YYYY/MM/DD/
/HRIT/IR_087/YYYY/MM/DD/
/HRIT/IR_097/YYYY/MM/DD/
/HRIT/IR_108/YYYY/MM/DD/
/HRIT/IR_120/YYYY/MM/DD/
/HRIT/IR_134/YYYY/MM/DD/
/HRIT/PRO/YYYY/MM/DD/我想将文件夹结构更改为:
/HRIT/YYYY/MM/DD/来自EPI、HRV、VIS006、VIS008、WV_062、WV_073、IR_016、IR_039、IR_087、IR_097、IR_108、IR_124、IR_134、PRO的所有文件不应物理复制,而应通过主页文件夹/home中的链接访问。
-> /home/HRIT/YYYY/MM/DD/有可能吗?怎么可能?
这里是一个极小的例子,我的原则上和我希望的结果:
我有:
/HRIT/EPI/2019/01/01/epi_1.txt
/HRIT/EPI/2019/01/01/epi_2.txt
/HRIT/HRV/2019/01/01/hrv_1.txt
/HRIT/HRV/2019/01/01/hrv_2.txt
/HRIT/VIS006/2019/01/01/vis006_1.txt
/HRIT/VIS006/2019/01/01/vis006_2.txt因此,我希望:
/home/HRIT/2019/01/01/epi_1.txt
/home/HRIT/2019/01/01/epi_2.txt
/home/HRIT/2019/01/01/hrv_1.txt
/home/HRIT/2019/01/01/hrv_2.txt
/home/HRIT/2019/01/01/vis006_1.txt
/home/HRIT/2019/01/01/vis006_2.txt如上所述,不应该将文件复制到这个新的文件夹结构中,而应该通过链接进行访问(因为实际上我有太多的文件,没有足够的空间来复制它们)。
!!!这是非常简化的,因为我有不同的年份,月和日(请参阅上面的链接)。
发布于 2020-03-11 21:36:58
这里有一个小脚本来完成这个任务。默认情况下,我只让它回显,您需要使用--real运行它,以使它执行链接
这假设您在/HRIT/ dir中运行脚本,并假设日期,然后文件名是层次结构的最后一部分。如果有更多的脏下面,这可能不适用于你。
DRYRUN=true
LINK="ln -s" # You can make this "ln" if you prefer hardlinks
if [[ $1 == '--real' ]]; then
DRYRUN=false
fi
for file in $(find "$PWD" -type f); do
dest=$( \
echo "$file" | awk -F/ '{ year = NF-3; mon=NF-2; day=NF-1; print "/home/HRIT/"$year"/"$mon"/"$day"/"$NF }' \
)
if [[ -f "$dest" ]]; then
echo "Skipping '$file' as destination link already exists at '$dest'"
else
if $DRYRUN; then
echo $LINK "$file" "$dest"
else
$LINK "$file" "$dest"
fi
fi
done发布于 2020-03-11 23:47:30
最简单的同时读取循环:
generate_list_of_files_for_example_with_find |
while IFS= read -r line; do
IFS='/' read -r _ hrit _ rest <<<"$line"
echo mkdir -p /home/"$hrit"/"$(dirname "$rest")"
echo ln -s /home/"$hrit/$rest" "$line"
done删除echo以真正创建链接和目录。
https://stackoverflow.com/questions/60564587
复制相似问题