首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改文件夹结构并通过使用链接使文件可用

更改文件夹结构并通过使用链接使文件可用
EN

Stack Overflow用户
提问于 2020-03-06 12:59:08
回答 2查看 83关注 0票数 1

(请参见底部的最小示例)

我有以下文件夹结构:

https://drive.google.com/open?id=1an6x1IRtNjOG6d9D5FlYwsUxmgaEegUY

每个文件夹在末尾显示:日期、月份和日期:

例如:

代码语言:javascript
复制
 /HRIT/EPI/2004/01/14

在里面的每一天,每个子文件夹包含大量的文件(总共约10 TB)。

所有可用的文件夹是:

代码语言:javascript
复制
/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/

我想将文件夹结构更改为:

代码语言:javascript
复制
/HRIT/YYYY/MM/DD/

来自EPIHRVVIS006VIS008WV_062WV_073IR_016IR_039IR_087IR_097IR_108IR_124IR_134PRO的所有文件不应物理复制,而应通过主页文件夹/home中的链接访问。

代码语言:javascript
复制
-> /home/HRIT/YYYY/MM/DD/

有可能吗?怎么可能?

这里是一个极小的例子,我的原则上和我希望的结果:

我有:

代码语言:javascript
复制
/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

因此,我希望:

代码语言:javascript
复制
/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

如上所述,不应该将文件复制到这个新的文件夹结构中,而应该通过链接进行访问(因为实际上我有太多的文件,没有足够的空间来复制它们)。

!!!这是非常简化的,因为我有不同的年份,月和日(请参阅上面的链接)。

EN

回答 2

Stack Overflow用户

发布于 2020-03-11 21:36:58

这里有一个小脚本来完成这个任务。默认情况下,我只让它回显,您需要使用--real运行它,以使它执行链接

这假设您在/HRIT/ dir中运行脚本,并假设日期,然后文件名是层次结构的最后一部分。如果有更多的脏下面,这可能不适用于你。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-03-11 23:47:30

最简单的同时读取循环:

代码语言:javascript
复制
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以真正创建链接和目录。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60564587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档