2014-10-17 114 views
1

我试图将我的目录中的所有文件单独移动到新目录phonex,并在同一时间将它们重命名为phonex.txt。 例如,awk系统语法抛出错误

1.txt, 2.txt, jim.txt

成为:

phone1.txt in directory phone1 
phone2.txt in directory phone2 
phone3.txt in directory phone3. 

我是一个新手,awk的,但我已成功地创建目录,但我不能得到正确的重命名。 我曾尝试:

ls|xargs -n1|awk ' {i++;system("mkdir phone"i);system("mv "$0" phone”i ”.txt -t phone"i)}' 

哪些错误,有很多:

mv: cannot stat `phone”i': No such file or directory 

和:

ls|xargs -n1|awk ' {i++;system("mkdir phone"i);system("mv "$0" phone”i ”/phone"i”.txt”)}' 

错误:

awk: 1: unexpected character 0xe2 

xargs的:/斌/回声:由信号13终止任何人都可以帮我完成它吗? TIA!

+2

设置为零x=0看起来像使用'”'而不是'“'的简单情况。 – 2014-10-17 11:29:09

+1

在一般,特别是如果你是初学者,使用'system'是非常危险的,如果你把一个错误的语法正确的程序放在一起,'system'会很高兴,例如,文件系统......(注意,我并不是暗示这是你的程序的情况,我正在讨论一种可能性),我倾向于在stdout上打印命令并在应用程序之前检查程序的输出,并且只有当我非常有信心我的工作的正确性我(1)将输出输出到'| sh'或(2)用'system(...)'更改'print ...'。 – gboffi 2014-10-17 11:38:27

+0

现在,更具体的评论:您通过将'file1'放入'folder1','file2'放入'folder2'中来复制**信息。有时冗余是好的工程,有时是浪费。 – gboffi 2014-10-17 11:43:12

回答

1

如果你想要增加数字。
Else Tom Fenech的方式是走的路!

for i in *.txt;do d=phone$((++X));mkdir "$d"; mv "$i" "$d/$d.txt";done 

你也可能要为x的情况下,在此之前它已经被设置为别的

+0

评论清除:)我更喜欢@TomFenech之一,因为它试图复制只有目录创建是好的(但这也可能有其他副作用) – Tensibai 2014-10-17 12:19:55

+0

感谢百万! – schoon 2014-10-17 12:20:37

3

配管ls转换为xargs转换成awk在这种情况下是完全不必要的。你所要做的可以用一个简单的循环来完成:

for f in *.txt; do 
    i=$((i+1)) 
    dir="phone$i" 
    mkdir "$dir" && mv "$f" "$dir/$dir.txt" 
done 

根据您的外壳,$i增量可以以不同的方式来完成(如((++i))在bash),但这种方式是符合POSIX标准所以应该在任何现代的外壳上工作。

顺便说一句,你原来的错误的原因是你使用的卷曲引号,这是shell不能理解的。您应该始终只在shell中使用单个的'和双倍的"