linux 在参数中为循环awk输出编写bash脚本

z6psavjg  于 2023-05-16  发布在  Linux
关注(0)|答案(3)|浏览(130)

我在写一些bash练习,这特别是要检查所有名为file-a(sonenumber)的文件,并将其移动到名为dirA的目录中,但是for循环有一些问题,我可以在没有for循环的情况下这样做,只是简单地写

mv $(ls -la | awk '$9 - /-a[0-9]+/ {print $9}') dirA

但是我想用for来做,我不能这么做,这是剧本

FILES=(ls -la | awk '$9 - /-a[0-9]+/ {print $9}')

for arg in "$FILES"
do
       mv $arg dirA
done
wqnecbli

wqnecbli1#

不需要for循环,只需要一个shell glob

mv -- *-a[0-9]* dirA

如果你坚持循环:

files=( *-a[0-9]* )

for f in "${files[@]}"; do
    mv "$f" dirA/
done

for f in *-a[0-9]*; do
    mv "$f" dirA/
done

但是,避免解析ls输出。
ls是一个交互式查看目录元数据的工具。任何使用代码解析ls输出的尝试都是无效的。Globs更加简单和正确:for file in *.txt。读取http://mywiki.wooledge.org/ParsingLs
Don't use UPPER case variables

h7appiyu

h7appiyu2#

您没有将FILES设置为命令的输出。因此,您需要使用$(command)。要使其成为一个数组,请在其周围 Package 另一组()
然后要循环遍历数组内容,请使用"${FILES[@]}
我不知道你为什么要使用ls -la,而你可以只使用ls -a。然后每个文件名将是一行,你不必提取$9

FILES=($(ls -a | awk '/-a[0-9]+/'))

for arg in "${FILES[@]}"
do
       mv "$arg" dirA
done

最好是not to parse the output of ls

xj3cbfub

xj3cbfub3#

我修改了你的代码,让它在for循环中工作。

FILES=$(ls -la | awk  '/-a[0-9]+/ {print $9}') 
for arg in $FILES 
do 
  mv $arg dirA
done

相关问题