但是,我现在需要深入研究Bash以获得当前的工作,而且我在语法和适当的命令方面遇到了困难。
我需要一个简单的(概念性)脚本,它将:
~/Desktop/Archive
文件夹)~/Desktop/Archive
除外)移动到“存档文件夹” - 并将时间戳附加到要移动的文件名的末尾。这是最后一篇文章 - 时间戳添加 - 这让我感到高兴。
我希望能找到一个清晰简单的解决方案。这是我到目前为止所提出的:
#!/bin/bash
shopt -s extglob
FOLDERARCH="Archive Folder"
cd ~/Desktop
if [ ! -d $"FOLDERARCH" ]; then
mkdir "$FOLDERARCH"
echo "$FOLDERARCH did not exist, was created"
fi
mv !(-d "$FOLDERARCH") "$FOLDERARCH"
最后一点说明:上面的脚本有效(没有时间戳),但也以消息
结束mv: rename Archive Folder to Folder/Archive Folder: Invalid argument
为什么?
任何帮助都将深深地,深深地感激。请假设我基本上知道关于BASH环境,cmds和他们的论点 - 这第一次请求帮助标志着我迈向至少精通的旅程的第一步。
首先:非常感谢我收到的回复;他们非常有用。
我现在已经得到它本质上是一个工作版本,但有一些奇怪的我不明白,经过几个小时的尝试研究,还没有理解/解决。
我希望有一些见解;我觉得自己即将在理解方面取得一些进展,但这些异常现象阻碍了我的进步。到目前为止,这是我的(工作,带有“问题”)代码:
shopt -s extglob
FOLDERARCH="Archives"
NEWARCH=$(date +%F_%T)
cd ~/Desktop
if [ ! -d $"FOLDERARCH" ]; then
mkdir "$FOLDERARCH"
echo "$FOLDERARCH did not exist, was created"
fi
mkdir "$FOLDERARCH/$NEWARCH"
mv !(-d "$FOLDERARCH") $FOLDERARCH/$NEWARCH
这实际上很大程度上实现了我的目标,但是:
在桌面Archives文件夹已经存在的情况下,我希望if-then结构只是跟进(没有echo msg)到下面的mkdir命令,而是msg“Archives not exists” ,创建“msg输出无论如何(错误地)。关于为什么会有任何答案?
脚本使用以下消息完成:
mv: rename Archives to Archives/2016-01-10_00:06:54/Archives: Invalid argument
我根本不明白这一点;应该发生的事情是桌面上除/Desktop/Archives
文件夹之外的所有文件/文件夹都应该移动到/Desktop/Archives
新创建的“子文件夹”,例如/Desktop/Archives/2016-01-10_00:06:54
。事实上,这一举动实现了我的目标,但消息的产生对我来说毫无意义。什么是无效的论点?
最后一点:在我的新手状态的这一点上,我正在寻找清晰易读的代码,而不是更优雅/复杂的单线管道命令解决方案。我期待着在适当的时候努力工作。
答案 0 :(得分:2)
您有几种选择。其中一个最简单的方法是遍历~/Desktop
下面的目录,如果它们不是"$FOLDERARCH"
,请将它们移到"$FOLDERARCH"
,例如:
for i in */; do
[ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH"
done
我还没有运行测试用例,但是类似于以下内容应该有效。
#!/bin/bash
shopt -s extglob
FOLDERARCH="Archive Folder"
cd ~/Desktop || { printf "failed to change to '~/Destop'\n"; exit 1; }
if [ ! -d "$FOLDERARCH" ]; then
if mkdir "$FOLDERARCH" , then
echo "$FOLDERARCH did not exist, was created"
else
echo "error: failed to create '$FOLDERARCH'"
exit 1
fi
fi
for i in */; do
[ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH"
done
我道歉,我忘记了 datestamp 部分。正如评论中所指出的,您可以包含 datestamp (根据您的喜好设置格式),其内容类似于以下内容:
tstamp=$(date +%s)
for i in */; do
[ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH/${i}_${tstamp}"
done