繁体   English   中英

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

[英]How to move files in Linux based on its name in a folder with a corresponding name?

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

例如:

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

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

 ls * .0000 | awk -F. '{Print $ 2}'

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

最初的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

我会做这样的事情:

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标志避免出现任何警告),最后将文件移动到全新的文件夹中。

您可以使用rename来完成 ,也就是Perl重命名。

尝试在临时目录中复制文件。

如果使用-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上,像这样使用homebrewbrew install rename

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM