如何在将所有文件复制到源到目标时获取根文件夹中的主文件夹名称

how can i get main folder name inside root folder while copying all files to source to destination

提问人:lemon chow 提问时间:5/18/2023 更新时间:5/18/2023 访问量:56

问:

我在input_scan里面有文件夹,但我需要 folder1 和 folder3,因为它们是 5.txt、1.txt 和 2.txt 的超级文件夹。我怎样才能得到这个?使用当前代码,我得到 5.txt 的 folder1、1 .txt 的文件夹 2 和 2 .txt 的文件夹 7

Ex:
input_scan
 /folder1
   /5.txt
   /folder2
     /1.txt
 /folder3
  /folder4
   /folder5
    /folder6
      /folder7
       /2.txt


while IFS= read -r -d '' file; do
    if [ -f "$file" ]; then
        parent_dir=$(basename "$(dirname "$file")")
        echo $parent_dir
    fi
done < <(find "input_scan" -type f -print0)

bash shell 文件 unix

评论


答:

2赞 jhnc 5/18/2023 #1

for d in input_scan/*/; do
    if find "$d" -type f -print -quit | grep -q .; then
        basename "$d"
    fi
done

在 中运行每个候选路径。如果找到任何文件,请打印其基本名称(忽略尾部斜杠)。findinput_scan/*/

-quit查找选项可提高效率 - 一旦找到任何匹配项,无需继续搜索树。


目前尚不清楚所需的条件是什么 - 示例代码建议(子)目录中存在任何文件。如果这不是唯一的条件,则可以在 find 命令中添加额外的子句(例如。-name '*.txt')

2赞 Jetchisel 5/18/2023 #2

使用 GNU utils。

find "input_scan" -type f -print0 | cut -zd'/' -f2 | sort -zu 

如果是 shell 循环。

#!/usr/bin/env bash

declare -A uniq
while IFS= read -rd '' file; do
  dir=${file#*/}
  ((uniq["${dir%%/*}"]++))
done < <(find "input_scan" -type f -print0)
printf '%s\n' "${!uniq[@]}"

由于不需要计算目录,因此我们可以更改

((uniq["${dir%%/*}"]++))

沃克斯

uniq["${dir%%/*}"]=
1赞 ufopilot 5/18/2023 #3
$ find ./input_scan -type f -name "*.txt" -printf "%P\n"|sed 's/\/.*//'|uniq
folder1
folder3