【问题标题】:How to make folders for individual files within a directory via bash script?如何通过 bash 脚本为目录中的单个文件创建文件夹?
【发布时间】:2020-04-07 14:38:11
【问题描述】:

所以我有一个电影收藏被转储到一个文件夹中(我知道,回想起来是不好的做法。)我想稍微组织一下,以便我可以使用 Radarr 获取所有适当的元数据,但我需要所有各自文件夹中的单个文件。我创建了下面的脚本来尝试自动化该过程,但出现以下错误。

脚本

#! /bin/bash

for f in /the/path/to/files/* ;
 do
    [[ -d $f ]] && continue
    mkdir "${f%.*}"
    mv "$f" "${f%.*}"
done

编辑

所以我现在按照 Benjamin W 的建议通过 Shellcheck.net 运行脚本。根据该站点,它不会引发任何错误,尽管当我尝试运行该命令时仍然会遇到相同的错误。

编辑 2*

现在没有错误,但是脚本在执行时什么都不做。

【问题讨论】:

  • shellcheck.net 会告诉你在作业中= 周围不能有空格。
  • 你不应该那样编辑你的问题,现在这是一个完全不同的问题。它只影响一个答案(我的),但考虑到像我在答案中的第一句话这样的事情不再有意义。您可以提出一个新问题,或者在 cmets 中跟进我的回答(就像您所做的那样)。

标签: bash file directory


【解决方案1】:

分配只评估一次,而不是每当使用分配给的变量时,我认为这是您的脚本所假定的。

你可以使用这样的循环:

for f in /path/to/all/the/movie/files/*; do
    mkdir "${f%.*}"
    mv "$f" "${f%.*}"
done

这使用parameter expansion 而不是cut 来消除文件扩展名。

【讨论】:

  • 所以当我尝试运行它而不是我的脚本时,它会失败,因为它试图将文件夹移动到自身中。 ```mv: 无法将 '/path/` 移动到其自身的子目录,'/path/````
  • @TaylorCohron 你只运行这 4 行,没有别的,对吧?您无需执行其他任务即可使用此解决方案。
  • 确实只有 4 行,我所做的唯一更改是更新正确文件夹的路径。鉴于路径末尾的通配符(我假设 * 在 bash 中以这种方式工作),它会知道它正在尝试为每个文件而不是父文件夹本身执行此操作?我还需要为 in 文件夹中的每个文件指定其他任何操作吗?
  • @TaylorCohron for f in /some/path/* 确实不应该尝试对 /some/path 目录本身做任何事情。听起来您的目录不仅包含文件,还包含目录?这会导致您看到的错误。如果是这种情况,您可以添加检查以确保您只处理文件,例如 [[ -d $f ]] && continue 以跳过目录。
  • 我应该在哪里添加这个论点?我假设在循环的定义中,但这样做时出错了,所以我将它作为第一行添加到函数本身中,脚本将运行,但它不会对文件夹进行任何实际修改。这是我目前在帖子中的脚本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多