使用Bash对三个最新文件进行Scp
我正在尝试scp目录中的三个最新文件。现在,我使用使用Bash对三个最新文件进行Scp,bash,scp,Bash,Scp,我正在尝试scp目录中的三个最新文件。现在,我使用ls-t | head-3查找它们的名字,然后在scp命令中写出它们,但这变得很困难。我试着使用ls-t | head-3 | scp*用户名*@*地址*:*路径*,但这不起作用。最好的方法是什么?编写一个简单的bash脚本。这一个将发送最后三个文件,只要它们是文件而不是目录 #!/bin/bash DIR=`/bin/pwd` for file in `ls -t ${DIR} | head -3`: do if [ -f ${file
ls-t | head-3
查找它们的名字,然后在scp命令中写出它们,但这变得很困难。我试着使用ls-t | head-3 | scp*用户名*@*地址*:*路径*
,但这不起作用。最好的方法是什么?编写一个简单的bash脚本。这一个将发送最后三个文件,只要它们是文件而不是目录
#!/bin/bash
DIR=`/bin/pwd`
for file in `ls -t ${DIR} | head -3`:
do
if [ -f ${file} ];
then
scp ${file} user@host:destinationDirectory
fi
done
也许是最简单的解决方案,但它不处理文件名中的空格
scp `ls -t | head -3` user@server:.
使用xargs的优点是可以处理文件名中的空格,但会执行三次scp
ls -t | head -3 | xargs -i scp {} user@server:.
基于循环的解决方案应该是这样的。我们在这里使用while read,因为read的默认分隔符是换行符,而不是像for循环那样的空格符
ls -t | head -3 | while read file ; do scp $file user@server ; done
遗憾的是,完美的解决方案,即在执行单个scp命令的同时很好地使用空白,目前我还没有找到。请尝试使用此脚本,从提供的第一个参数路径中scp最新的3个文件到此脚本:
#!/bin/bash
DIR="$1"
for f in $(ls -t `find ${DIR} -maxdepth 1 -type f` | head -3)
do
scp ${f} user@host:destinationDirectory
done
find-typef
确保在${DIR}中只找到文件,head-3
占据前三名文件。这可能与海报无关,但你给我带来了一个想法,我认为这正是你想要的:
tar cf - `ls -t | head -3` | ssh *username*@*server* tar xf - -C *path*
如果前2个条目不是文件,它将只发送1个文件。与其他答案相同,如果前2个条目不是文件,它也将只发送1个文件。我不相信海报曾在他的要求中列出他需要处理的目录。事实上,他这样做的方式意味着他不喜欢使用-i/{}xarg选项。这是否只会导致对scp的1次调用,而不是我们期望的基于for循环的解决方案的3次调用?遗憾的是,不会。此解决方案基本上实现了循环。它只是打字更快,而且可以处理空白。让我考虑一下,这应该是一种让它作为一个命令执行的方法。可能需要更多的打字;-)幸运的是,我从来没有在文件名中加空格,所以您的第一个解决方案应该非常有效。谢谢这正是我想要的。如果文件名中有空格,此解决方案将失败。你应该使用read,这是焦油的巧妙用法。下次需要使用此命令时,我必须尝试一下。谢谢你的发帖!