我有一个这样的文本文件:
Order,Site_ID
[email protected],AR-Slu
“订单”列包含要移到“ Site_ID”列中显示的相应文件夹(文本文件中的同一行)的文件夹的名称。这是仅移动一个文件夹的示例。在此示例中,我想将文件夹“ [email protected]”移动到文件夹“ AR-Slu”。表中包含的信息是文件夹的名称,但没有文件夹的路径信息。但是,这两个文件夹位于同一父文件夹中。有人会知道该怎么做吗?
(与您问题的初始版本一样)
(cd /parent/folder && tail -n +2 | xargs -L 1 mv --) < file
的tail
是跳过标题。
使用-L 1
,对输入的每1行xargs
运行一个mv
命令,并将该行上的单词作为参数传递给mv
。
对于xargs
,单词是用空格定界的(无论是全是空格还是仅空格和制表符取决于xargs
实现),尽管它们xargs
也可以识别"
,'
并且\
作为引用运算符可以用来对这些空格或彼此进行转义。
您还可以使用while read
shell循环:
(
cd /parent/folder || exit
unset -v IFS
read skip_header <&3
ret=0
while read src dst rest_ignored <&3; do
mv -- "$src" "$dst" || ret=$?
done
exit "$ret"
) 3< file
同样,对于read
和使用默认值$IFS
(或之后unset IFS
),单词之间用空格或制表符分隔。\
可用于逃避这些错误或本身,或在下一条物理行上继续行。
如果该文件是CSV文件(值之间用,
引号分隔,并且可能用引号引起来),则可以在ksh93
Shell中运行该循环,并使用-S
其read
内置选项进行CSV解析:
#! /bin/ksh93 -
(
cd /parent/folder || exit
IFS=,
read -S skip_header <&3
ret=0
while read -S src dst rest_ignored <&3; do
mv -- "$src" "$dst" || ret=$?
done
exit "$ret"
) 3< file
您可以取消该-S
选项,因此它也可以在其他POSIX shell中使用,例如bash
只要文件中不使用CSV引号就可以使用。
或者,您可以使用CSV解析模块perl
或其他脚本语言:
(cd /parent/folder && perl -C -MText::CSV -e '
$c = Text::CSV->new;
$ret = 0;
$c->getline(STDIN); # skip header
while (($src, $dst) = @{$c->getline(STDIN)}) {
system "mv", "--", $src, $dst;
$ret = 1 if $?;
}
exit $ret;') < file
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句