Mat*_*att 2 bash text-processing filenames
我是一名评分员,提交给我的文件最终位于以学生姓名命名的文件夹中,该文件夹本身位于我的 linux 共享上的特定文件夹中。
目前我浏览每个源文件并在每个文件的顶部手动添加注释,以便在打印它们时我可以知道哪些文件属于哪些学生。
我想要做的是递归地浏览作业文件夹,当我下拉到每个学生文件夹时,使用学生目录名称在该文件夹中的每个文件的顶部添加一条评论,以了解要添加到评论中的内容。
这似乎与在文件顶部添加评论类似,但我不确定如何在放入每个学生文件夹时动态创建评论。
最近更新
仍然无法正常工作,但这是我所做的更改,因此您不必寻找它们。
我做了一些改变:
'inisn't提前终止了它。 -writable为-perm 664可写会引发错误,并且我尝试更改的所有文件在上传时都设置为 644。如果您知道比这更好的方法,请告诉我。echo $1在 exec 参数中添加确认了这一点),所以我在 exec 参数的末尾添加_filepath={}并删除了{}。_dirname为_filepath_filepath我很确定它不起作用的原因是因为调用 ed 的行中的单引号关闭了 exec 参数。
当前代码:
student_head_action() {
# We can't use parameter expansion on $PWD because of recursion
local _dirname="${1%/*}"
_dirname="${_dirname##*/}"
[[ -d $1 ]] && return 0
if ! [[ -w $1 && -f $1 ]]; then
printf '%s\n' "$1 does not exist or is not writeable, skipping"
return 1
fi
ed -s "$1" <<< $'0a\n'"//${_dirname}"$'\n.\n,s/\r//g\nw'
}
student_head() {
local _file
if (( $# )); then
for _file; do
student_head_action "${_file}" || _retval=1
done
else
if shopt -qs globstar; then
for _file in **/*; do
student_head_action "${_file}" || _retval=1
done
shopt -u globstar
else
printf "%s\n" "Globstar isn't available, attempting to use GNU find ..."
find . -type f -perm 644 -exec bash -c '
_filepath={}
_dirname=$_filepath
_dirname="${_dirname%/*}"
_dirname="${_dirname##*/}"
echo $_dirname
ed -s "$_filepath" <<< '"$'0a\n'"'"//${_dirname}"'"$'\n.\n,s/\r//g\nw'" \;
fi
fi
return "${_retvalue-0}"
Run Code Online (Sandbox Code Playgroud)
您可以student_head在文件夹中运行when 自动将文件夹名称作为标题添加到其中的可写文件及其子目录:
student_head_action() {
# We can't use parameter expansion on $PWD because of recursion
local _dirname="${1%/*}"
_dirname="${_dirname##*/}"
[[ -d $1 ]] && return 0
if ! [[ -w $1 && -f $1 ]]; then
printf '%s\n' "$1 does not exist or is not writeable, skipping"
return 1
fi
bash -c "ed -s {} <<< $'0a\n'"# Student: ${_dirname}"$'\n.\n,s/\r//g\nw'"
}
student_head() {
local _file
if (( $# )); then
for _file; do
student_head_action "${_file}" || _retval=1
done
else
if shopt -s globstar > /dev/null 2>&1; then
for _file in **/*; do
student_head_action "${_file}" || _retval=1
done
shopt -u globstar
else
printf '%s\n' 'Globstar isn't available, attempting to use GNU find...'
find . -type f -writable -exec bash -c '
_dirname="${1%/*}\
_dirname="${_dirname##*/}\
ed -s "$1" <<< '"$'0a\n'"'"# Student: ${_dirname}"'"$'\n.\n,s/\r//g\nw'" {} \;
fi
fi
return "${_retval-0}"
}
Run Code Online (Sandbox Code Playgroud)
把这些功能放到你的~/.bashrc,如果你想student_head使用的时候永远是你的用户访问bash。
student_head 可以通过两种方式调用:
如果参数中的文件不存在,则student_head返回退出状态 1。
应该提到的是,该脚本使用globstar,这需要bash>=4.0.