【问题标题】:find file in subfolder, move to other directory, and delete subfolder after moving with find -exec在子文件夹中查找文件,移动到其他目录,移动后使用 find -exec 删除子文件夹
【发布时间】:2017-06-03 18:19:34
【问题描述】:

我正在寻找以下内容: 我想在我的目录中的所有子文件夹中搜索带有 .m4a 的文件。当找到具有此结尾的文件时,我想将其移动到另一个文件夹。但之后我想删除这个子文件夹。我坚持最后一步。 到目前为止,我有:

    find . -name '*.m4a' -type f -exec mv {} /path/to/storage \;

我不知道如何删除子文件夹,找到了 m4a 文件。另外我不想意外删除任何其他文件夹(我的意思是如果我错误地应用了 rm 命令。删除子文件夹,我在哪里找到了一个 m4a 文件,没关系)。基本上,我不确定如何控制删除,我可以在 find 命令中添加这个命令和另一个 -exec 吗? 谢谢!

【问题讨论】:

  • 移动到文件夹有什么好处,为什么不一次删除文件?
  • 你的意思是要删除原来的文件夹吗?
  • 我希望在子文件夹中选择一个以 m4a 结尾的文件。将其推入收集文件夹,删除子文件夹的其余内容并删除子文件夹。我不想删除 m4a 文件,但在将所选文件移出后,此文件夹中的剩余文件。

标签: bash find exec


【解决方案1】:

这样的事情应该没问题。

如果您对结果感到满意,您可以移除回声以执行实际操作:

find . -name '*.m4a' -type f -exec sh -c 'echo "mv {} /path/to/storage";echo "rm -r "$(dirname {})"" ' \;

请注意,如果 /path/to/storage 是您执行查找的当前工作下的子目录,也将被删除,如下所示:

$ pwd
/home/gv/Desktop/PythonTests/tmp/tmp2
$ find . -name 'test.txt' -exec sh -c 'echo "mv {} /home/gv/Desktop/PythonTests/tmp/tmp2";echo "rm -r "$(dirname {})"" ' \;
mv ./tmp3/test.txt /home/gv/Desktop/PythonTests/tmp/tmp2  #indeed test.txt was in subfolder tmp3 under cwd tmp2
rm -r ./tmp3  #this is good - file moved , tmp3 removed also
mv ./test.txt /home/gv/Desktop/PythonTests/tmp/tmp2  #oops. find returned the result after previous mv , now file is found under tmp2
rm -r .  #tmp2 gone also!

【讨论】:

  • 乔治,谢谢你的帮助。存储路径不是子文件夹。我在没有回显并删除''的情况下尝试了您的命令,但我收到:find:-exec:没有终止“;”或“+”rm:“。”并且“..”可能不会被删除 rm: ;: No such file or directory 我会尝试找出它为什么不起作用。
  • 我还想指出,-exec rm -r $(dirname {}) 翻译成“.”的当前目录。但这似乎不是子文件夹目录。我仍然无法删除子文件夹,移动作品。但我当然不想意外删除顶级目录和我的硬盘。
  • 我试了几个小时,但最终还是使用了一个很好的旧 for 循环。为此表示歉意。代码现在看起来像这样 SAVEIFS=$IFS IFS=$(echo -en "\n\b") for i in find . -name "*.m4a" do filename="$(basename $i)" #echo $filename subfolderpath="$( dirname $i)" #echo $subfolderpath mv "$subfolderpath/$filename" "$targetdirectory/" rm -r $subfolderpath done
  • @Gudrun 你确定这个不适合你吗?对我来说似乎工作正常:find . -name 'test.txt' -exec sh -c 'mv {} /home/gv/Desktop/PythonTests/tmp/tmp2;rm -r "$(dirname {})" ' \;
  • 是的,这不起作用。命令:find /toplevel/folder/to/be/searched -name "*.m4a" -exec sh -c 'mv {} /path/to/storage/folder; rm -r "$(目录名 {})" ' \;错误消息:sh: -c: line 0: syntax error near unexpected token `(' 虽然,这现在是另一个错误消息,在我得到之前 rm 无法删除“.”和“..”。也许这很重要我在 10.12.4 iOSX 上运行。
猜你喜欢
  • 1970-01-01
  • 2022-12-10
  • 2014-02-10
  • 2021-08-02
  • 2021-03-04
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多