[英]How to move files in Linux based on its name in a folder with a corresponding name?
我需要通过脚本将一系列文件移动到某些文件夹中。 这些文件的格式为xxxx.date.0000
,我必须将它们移动到名称与给定值相同的文件夹中。
例如:
理想的情况是即使在移动文件之前也能够创建文件夹,但这不是优先事项,因为我可以手动创建它们。 我设法通过
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*
perl-rename
。 rename
brew install rename
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.