如何将文件移动到同名的相应文件夹中?

如何将文件移动到同名的相应文件夹中?

示例场景:

我有多个以 结尾的文件.torrent,我想将它们移动到同名的文件夹中。

例如给定以下文件:

abc.torrent
def.torrent
some files has spaces.torrent
or [special] (characters).torrent
or . (dots).torrent
xyz.torrent

我想将它们移动到具有完全相同名称的相应文件夹(如果存在),例如:

  • abc.torrent进入abc/
  • def.torrent进入def/
  • 等等

如果该文件夹不存在,文件应该保持不变(因为它可能与不完整的下载有关)。

我认为 BitTorrent 没有这样的选项。如果是的话,我想找一些命令行来实现这一点。

或者,我想指定我的文件的源文件夹和包含预期目录的目标文件夹。

有任何想法吗?

答案1

  • 非递归地:

    for t in *torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done 
    

    该语法从变量末尾${var%pattern}删除最短匹配。在本例中,它只是删除扩展名。pattern

  • 递归(使用bash):

    shopt -s globstar
    for t in **/*torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done
    

    globstar选项**匹配任意文件和 0 个或多个目录。请注意,上述操作要求目标目录是 torrent 文件父目录的子目录。因此,如果文件位于foo/bar/baz.torrent,它将被移动到foo/bar/baz/baz.torrent

  • 非递归地,如果不存在则创建目录:

    for t in *torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done 
    

    -p选项指示mkdir如果目录已存在则不打印错误,并根据需要创建父目录。因此,如果和目录不存在,mkdir -p foo/bar/baz也将创建它们。foobar

  • 递归地,如果不存在则创建目录:

    shopt -s globstar
    for t in **/*torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done
    

答案2

由于我在 OS X 版本的 BitTorrent 上找不到这样的选项,因此我编写了以下单行代码:

find . -name "*.torrent" -exec sh -c 'DST=$(find . -type d -name "$(basename "{}" .torrent)" -print -quit); [ -d "$DST" ] && mv -v "{}" "$DST/"' ';'

这将查找.torrent当前目录中的文件 ( ),并递归查找在同一文件夹中找到的同名.文件夹 ( )。要检查不同的目录,请将点 ( ) 更改为适当的目标。查看完整脚本:DST..mv_torrents.sh

相关内容