【发布时间】:2016-04-11 04:14:23
【问题描述】:
几十年前我是一名程序员(IBM 汇编、Fortran、COBOL、MS DOS 脚本、一点 Visual Basic。)因此我熟悉 IF-Then-Else、For 循环等的通用性。
但是,我现在需要为我目前的工作深入研究 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 环境、cmd 及其参数 - 第一次寻求帮助标志着我迈向至少精通之旅的第一步。
更新
首先:非常感谢我收到的回复;它们非常有用。
我现在得到了它本质上是一个工作版本,但有一些我不明白的奇怪之处,经过数小时的尝试研究,还没有理解/解决。
我希望得到一些见解;我觉得我即将在理解方面取得一些真正的进展,但这些异常正在阻碍我的进步。到目前为止,这是我的(工作,有“问题”)代码:
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
这实际上在很大程度上实现了我的目标,但是:
-
1234563 , 已创建” 无论如何都会输出味精(错误地)。有什么原因的答案吗?
-
脚本以以下消息完成:
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。事实上,这一举动实现了我的目标,但信息的出现对我来说毫无意义。什么是无效参数?
最后一点:在我的新手状态下,我正在寻找清晰易读的代码,而不是更优雅/复杂的单行管道命令解决方案。我期待在适当的时候继续努力。
【问题讨论】:
-
顺便说一句,我在这些窗口中输入我的代码并让它保持正确的逐行格式,这很糟糕——在我看来,在我看来,它可以在没有换行符的情况下继续运行它。如果这是其他人的观点,请帮助我连贯地格式化它。 .