移动一系列编号的文件?


14

我有291个编号文件(开始于001-标题,结束于291-标题),需要移到单独的目录中。(从001到021到文件夹1,从022到053到文件夹2,它们不一定每次都具有相同数量的文件)。

我想我可以像这样令人讨厌的方式做到这一点: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

我几乎肯定有更好的方法,那会是什么?

编辑:这样就可以了,但我记得...

我不会因为使用终端而卡住,因此使用了文件管理器来单击和拖动。问题仍然存在。


1
您要在文件夹1中拥有21个子文件夹,在文件夹2中拥有22个文件夹吗?
丹尼尔·贝克

您查看过unix.SE吗?:有一个关于一个很好的线程在这里unix.stackexchange.com/questions/12976/...
chrisjlee

@DanielBeck不,我希望文件移至每个文件夹。每个文件夹有不同数量的文件。
罗布2012年

@ ChrisJ.Lee这与我之前/曾经做过的事情非常相似,我喜欢它。由于文件与另一个文件夹中的其他文件匹配,因此我可以ls -l | grep ^- | wc -l获取行数。
罗布2012年

1
@Rob对。尽管如此,进入每个目录的文件数量不同。自动化(包括规则)要比自己动手几次。
丹尼尔·贝克

Answers:


25

由于您说的并非总是21个文件,而是您需要手动移动文件,而要有效地做到这一点,您可以使用大括号扩展

mv filename{001..21} dir1
mv filename{022..53} dir2
...

看起来可行,我会尝试一下。
罗布2012年

1
如果在方括号后面添加通配符,则效果很好。这正是我所需要的。
罗布

2
如果数字在名称中间,则可以输入file{001..21}name,而不必使用通配符。无论如何,很高兴它为您工作。
drrlvn 2012年

1

这将按照您所描述的那样移动文件(除了第二个21文件的第二个范围是022到042)。

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done

它并不总是21个文件,但是谢谢。
罗布

0

我的意思是要移动许多文件(例如一万或一百万个),如果您仅使用{1..20},shell会抱怨文件列表太长,因此

zsh中,您可以加载内置的mv

setopt extended_glob zmodload

zsh /文件

之后,您可以使用以下命令:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

或者,如果您正在编写一些Shell脚本,则可以执行以下操作:

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

如果您不使用zsh,则可以参考/unix/128559/solving-mv-argument-list-too-long


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能无效。您将哪个答案称为“更详细的答案”?
Ramhound

由于OP希望将不同的文件移动到不同的目录,因此这并不能真正回答问题。
DavidPostill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.