如何创建子文件夹和移动文件
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
我有一个名为 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