如何在Linux中根据名称在具有相应名称的文件夹中移动文件?

时间:2019-01-31 11:31:21

标签: linux bash shell

我需要通过脚本移动某些文件夹中的一系列文件。这些文件的格式为xxxx.date.0000,我必须将它们移动到名称与给定值相同的文件夹中。

例如:

  • 文件hello.20190131.0000
  • 在文件夹20190131中

理想的情况是即使在移动文件之前也可以创建文件夹,但这不是优先事项,因为我可以手动创建它们。我设法通过

获得了视频中日期的值
 ls * .0000 | awk -F. '{Print $ 2}'

有人对如何进行有任何建议吗?

3 个答案:

答案 0 :(得分:1)

最初的awk命令提供了很多答案。您只需要对提取的目录名做些事情:

一个简单的选择:

ls *.0000 | awk -F. '{printf "mkdir -p '%s'; mv '%s' '%s';",$2,$0,$2}' | sh

使用大量文件可能会更有效:

ls *.0000 | awk -F. '{print $2}' |\
sort | uniq |\
while read dir; do
    mkdir -p "$dir"
    mv *."$dir".0000 "$dir"
done

答案 1 :(得分:0)

我会做这样的事情:

ls *.0000 |\
  sort |\
    while read f; do
      foldername="`echo $f | cut -d. -f2`"
      echo mkdir +p "$foldername/"
      echo mv "$f" "$foldername/"
    done

即:对于您的每个文件,我都使用cut命令来建立文件夹名称,并使用点作为字段分隔符,并获取第二个字段(在这种情况下为日期);然后使用mkdir -p创建该文件夹(如果该文件夹应该已经存在,则-p标志会避免发出任何警告),最后我将该文件移动到全新的文件夹中。

答案 2 :(得分:0)

您可以使用重命名(也称为Perl重命名)来实现。

在临时目录中的文件的 COPY 上尝试。

如果使用-p参数,它将自动为您创建任何必要的目录。如果您使用--dry-run参数,则可以看到它会做什么而无需实际执行任何操作。

rename --dry-run -p 'my @X=split /\./;  $_=$X[1] . "/" . $_'   hello*

示例输出

'hello.20190131.0000' would be renamed to '20190131/hello.20190131.0000'
'hello.20190137.0000' would be renamed to '20190137/hello.20190137.0000'

您需要知道的是,它会在名为$_的变量中为您传递文件的当前名称,并且希望您进行更改以返回所需的新文件名。

因此,我将当前名称拆分为数组X[]的元素,并以点(句点)作为分隔符:

my @X = split /\./

这给了我$X[1]中的输出目录。现在,我可以通过将新目录,斜杠和旧文件名放入$_中来设置所需的新文件名:

$_=$X[1] . "/" . $_

您也可以尝试使用此较短的版本:

rename --dry-run -p 's/.*\.(\d+)\..*/$1\/$_/' hello*

  • 在ArchLinux上,您将使用的软件包称为perl-rename
  • 在debian上,它称为rename
  • 在macOS上,使用自制软件,例如:brew install rename