如何创建子文件夹和移动文件

how to create subfolders and move files

我有一个名为 p/ 的文件夹,在 p/ 中我有几个子文件夹,如下所示:

$[~/p] ls
a/ b/ c/

a/ b/ 和 c/ 也各有多个子文件夹。 我试图在 p/ 的每个文件夹和子文件夹中找到一个与特定模式匹配的文件,并将它们移动到一个新目录到其相应的 a/、b/ 和 c/ 文件夹中。 因此,a/ 将有一个名为 x/ 的新子文件夹,并将在 a/ 中找到的所有匹配文件移动到 x/ 中,b/ 将有一个名为 x/ 的新子文件夹,并将找到的所有匹配文件移动到 x/ 中在 b/ 等等。

我试过:

pth=path/to/p

for dir in ${pth}/*; do 
    mkdir -- "$dir/x";
    find . -name '*match*' -exec mv -t ./x '{}' +;
done

但是它不起作用,它将 x/ 子文件夹变成 a/、b/ 和 c/,但它没有移动任何东西。

我得到了:

mv: failed to access to './x': No such file or directory

我做错了什么??你能帮帮我吗?

编辑: 这是文件夹结构的示例:

 p/
 -a/
   --t/
     --q/
       --p/
         -- files-to-match
   --f/
     --qd/
       --pe/
         -- files-to-match
   --d/
     --qu/
       --ip/
         -- files-to-match

文件夹 b 和 c 以及我拥有的其他文件夹也是如此。子文件夹的名称并不总是相同的。

@ikegami 提供给我的代码可以正常工作,但是文件夹 x/ 的位置在“匹配文件”的同一层结束,但我希望它位于第一层,与 t/、f/ 和 d/ 处于同一级别(对于此示例)。

所以最终的结构是:

 p/
 -a/
   --t/
     --q/
       --p/
         -- 
   --f/
     --qd/
       --pe/
         -- 
   --d/
     --qu/
       --ip/
         -- 
   --x/
     --matched-files

您没有使用正确的目录。变化

find . -name '*match*' -exec mv -t ./x '{}' +;

find "$dir" -name '*match*' -exec mv -t "$dir/x" '{}' +;

此外,您需要通过排除该路径来避免从 x 移动文件。

# $pth can't start with `-`.
# Prefix with `./` if necessary.
# $dir won't start with `-`.

pth=path/to/p

for dir in "$pth"/*; do 
   mkdir "$dir/x";
   find "$dir" \
      -wholename "$dir/x" -prune \
         -or \
      -name '*match*' -exec mv -t "$dir/x" {} +
done

测试

mkdir -p p/a/t/q/p
touch p/a/t/q/p/abc.json
mkdir -p p/a/f/qd/pe
touch p/a/t/q/p/def.json
mkdir -p p/b/t/q/p
touch p/b/t/q/p/ghi.json

pth=p

find "$dir" -name '*.json'
printf -- '--\n'

for dir in "$pth"/*; do 
   mkdir "$dir/x";
   find "$dir" \
      -wholename "$dir/x" -prune \
         -or \
      -name '*.json' -exec mv -t "$dir/x" {} +
done

find "$dir" -name '*.json'

输出

p/a/t/q/p/def.json
p/a/t/q/p/abc.json
p/b/t/q/p/ghi.json
--
p/a/x/def.json
p/a/x/abc.json
p/b/x/ghi.json