我需要通过脚本移动某些文件夹中的一系列文件。这些文件的格式为xxxx.date.0000
,我必须将它们移动到名称与给定值相同的文件夹中。
例如:
理想的情况是即使在移动文件之前也可以创建文件夹,但这不是优先事项,因为我可以手动创建它们。我设法通过
获得了视频中日期的值 ls * .0000 | awk -F. '{Print $ 2}'
有人对如何进行有任何建议吗?
答案 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*
perl-rename
。rename
brew install rename